socket
阐述
- Socket类提供一组丰富的网络通信方法和属性
- 允许使用枚举中列出的任何通信协议执行同步和异步数据传输
内容
命名空间:System.Net.Sockets
-
面向连接的协议(例如 TCP)
Tcp协议:服务器会处于监听状态,客户端进行通信验证后进行两边的消息收发。
.服务器端
客户端 -
面向无连接协议(例如 UDP)
Udp:无需侦听连接。调用 ReceiveFrom 方法以接受任何传入的数据报。 使用 SendTo 方法将数据报发送到远程主机。
构造函数
描述
使用指定的地址族、套接字类型和协议初始化 Socket 类的新实例。
参数解析
Socket socket =new Socket(AddressFamily.InterNetwork,SocketTypr.Stream,ProtocolType.Tcp);
- AddressFamily:可以使用的寻址方案
InterNetwork:IPV4地址
InterNetworkV6:IPV6地址
Max:max地址 - SocketType:支持的协议
Dgram:最大长度固定(通常很小)的无连接、不可靠消息(配合Udp使用)
Raw:支持对基础传输协议的访问(Icmp和Igmp使用)
Rdm:支持无连接、面向消息、以可靠方式发送的消息,并保留数据中的消息边界
Stream:支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界(配合 InterNetwork地址与Tcp协议使用) - 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:无连接,使用计算机资源少,数据报模式,可能丢包,不保证数据顺序