C# socket 通信服务概念及Tcp、Udp消息收发

socket

阐述

  1. Socket类提供一组丰富的网络通信方法和属性
  2. 允许使用枚举中列出的任何通信协议执行同步和异步数据传输

内容

命名空间:System.Net.Sockets

  1. 面向连接的协议(例如 TCP)

    Tcp协议:服务器会处于监听状态,客户端进行通信验证后进行两边的消息收发。.

    服务器端
    客户端

  2. 面向无连接协议(例如 UDP)

    Udp:无需侦听连接。调用 ReceiveFrom 方法以接受任何传入的数据报。 使用 SendTo 方法将数据报发送到远程主机。

构造函数

描述

使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。

参数解析

Socket socket =new Socket(AddressFamily.InterNetwork,SocketTypr.Stream,ProtocolType.Tcp);
  1. AddressFamily:可以使用的寻址方案

    InterNetwork:IPV4地址
    InterNetworkV6:IPV6地址
    Max:max地址

  2. SocketType:支持的协议

    Dgram:最大长度固定(通常很小)的无连接、不可靠消息(配合Udp使用)
    Raw:支持对基础传输协议的访问(Icmp和Igmp使用)
    Rdm:支持无连接、面向消息、以可靠方式发送的消息,并保留数据中的消息边界
    Stream:支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界(配合 InterNetwork地址与Tcp协议使用)

  3. ProtocolType:表示的套接字类型

    Icmp:网关到网关协议。
    Igmp:网际组管理协议。
    Tcp:传输控制协议。
    Udp:用户数据报协议。

Socket-TCP协议

服务器端 (发送消息)

	//实例化Socket对象
	Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);
	
	//初始化的新实例System.Net.IP地址
	//也可以使用 IPAddress.Parse("");
	IPAddress address = new IPAddress(new byte[] { 10, 151, xxx, xx});
	
	//创建SocketAdress实例
	EndPoint endPoint = new IPEndPoint(IpAddress.Parse("10.151.xxx.xx"), 3478);
	
	//将已经建立的空白的socket绑定在网络上让大家在需要时能够找得找到
	sk.Bind(endPoint);
	
	//侦听 参数为最大连接数
	sk.Listen(100);
	
	//创建新的System.Net.Sockets接口。Socket用于新创建的连接。
	//如果需要不断的发送或者接受消息需要不断创建本实例
	while(true)
	{
		//判断是否为连接状态
		if(sk.Poll(10,SelectModel.SelectRead))
		{
			break;	
		}
		Socket clientSocket = sk.Accept();
		//可以建立客户端通信逻辑,放到类里面进行处理
	}
	
	//所要发送的消息
	string message = "这个消息用于发送至客户端";
	
	//转化为byte类型
	byte[] by = Encoding.UTF8.GetBytes(message);
	
	//发送
	clientSocket.Send(by);

客户端 (接受消息)

	//实例化Socket对象
	Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);
	
	//初始化的新实例System.Net.IP地址
	//也可以使用 IPAddress.Parse("");
	IPAddress address = new IPAddress(new byte[] { 10, 151, xxx, xx});

	//创建SocketAdress实例
	//端口和ip地址需要和服务器端一致
	EndPoint endPoint = new IPEndPoint(address, 3478);
	
	//与服务器端进行连接
	sk.Connect(endPoint);
	
	//数据载体
	 byte[] bytearray = new byte[2048];
	 
	//获取数据
	int length = sk.Receive(bytearray);
	
	//数据转化 这边同样使用UTF8编码
	string data = System.Text.UTF8Encoding.UTF8.GetString(bytearray,0,length);

	//停止运行,关闭连接
	//关闭两边连接 既不接受也不发送
	sk.shutdown(SocketShutdown.Both);
	sk.Close();

Socket-UDP协议

无侦听机制,随发随到。

发送消息

     //实例化Socket对象
	Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
	EndPoint endPoint = new IPEndPoint(IPAddress.Parse(""),7788);
	
	//消息内容
	string message = "所要发送的内容";
	byte[] data = Encoding.UTF8.GetBytes(message);
	
	//发送数据,和ip:port信息
	sk.SendTo(data, endPoint);

接收消息

  //实例化Socket对象
  Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  udpServer.Bind(new IPEndPoint(IPAddress.Parse("109.10.xxx.xx"), 3477));
  byte[] data = new byte[2048];
  
  //保留发送数据者的ip:port信息
  EndPoint endPoint = new IPEndPoint(IPAddress.Any,0);

  //ref endPoint 获取ip信息
  int length= udpServer.ReceiveFrom(data, ref endPoint);
  string message = System.Text.Encoding.UTF8.GetString(data, 0, length);
  
  //获取ip信息
  string ip =(endPoint as IPEndPoint).Address.ToString();
  
  //关闭udp资源
  udpServer.Close();

区别

Tcp:基于连接,使用计算机资源多,流模式,保证数据正确性,保证数据顺序。
Udp:无连接,使用计算机资源少,数据报模式,可能丢包,不保证数据顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值