Socket套接字的作用
它是C#提供给我们用于网络通信的一个类(在其他语言当中也有对应的Socket类)
类名:Socket
命名空间:using System.Net.Sockets
Socket套接字是支持TCP/IP网络通信的基本操作单位
一个套接字对象包含
1.本机的IP地址和端口
2.对方主机的IP地址和端口
3.双方通信的协议信息
一个Socket对象表示一个本地或者远程套接字信息
它可以被视为一个数据通道
这个通道连接与客户端和服务端之间
一般在制作长连接游戏时,我们会使用Socket套接字作为我们的通信方案
我们通过它连接客户端和服务端,通过它来收发消息
你可以把它抽象的想象成一根管子,插在客户端和服务端应用程序上,通过这个管子来传递交换信息
Socket的类型
1.流套接字
主要用于实现TCP通信,提供了面向连接、可靠的、有序的、数据无差错且无重复的数据传输服务
2.数据报套接字
主要用于实现UDP通信,提供了无连接的通信服务。数据包的长度不能大于32KB,不提供正确性检查,不保证顺序,可能出现重发、丢失等情况
3.原始套接字
主要用于实现IP数据包通信,用于直接访问协议的较低层,用于侦听和分析数据包
通过Socket的构造函数,可以申请到不同类型的套接字
Socket s = new Socket();
参数一:AddressFamily 网络寻址 枚举类型,决定寻找方案
InterNetwork |
IPv4寻址 |
InterNetwork6 | IPv6寻址 |
UNIX | UNIX本地到主机地址 |
ImpLink | ARPANETIMP地址 |
Ipx | Ipx或SPX地址 |
Iso | ISO协议的地址 |
Osi | OSI协议的地址 |
NetBios | NetBios地址 |
Atm | 本机Atm地址 |
参数二:SocketType 套接字枚举类型,决定使用的套接字类型
常用 | |
Dgram | 支持数据报,最大长度固定的无连接、 不可靠的消息(主要用于UDP通信) |
Stream | 支持可靠、双向、基于连接的字节流(主要用于TCP通信) |
不常用 | |
Raw | 支持对基础传输协议的访问 |
Rdm | 支持无连接、面向消息、以可靠方式发送的消息 |
Seqpacket | 提供排序字节流的面向连接且可靠的双向传输 |
参数三:ProtocolType 协议类型枚举类型,决定套接字使用的通信协议
常用 | |
TCP | TCP传输控制协议 |
UDP | UDP用户数据报协议 |
做了解 | |
IP | IP网际协议 |
Icmp | Icmp网际消息控制协议 |
Igmp | Igmp网际组管理协议 |
Gap | 网关到网关协议 |
IPv4 | Internet协议版本4 |
Pup | PARC通用数据包协议 |
Idp | Internet数据包协议 |
Raw | 原始IP数据包协议 |
Ipx | Internet数据包交换协议 |
Spx | 顺序包交换协议 |
IcmpV6 | 用于IPv6的Internet控制消息协议 |
2、3参数的常用搭配:
SocketType.Dgram + ProtocolType.Udp = UDP协议通信
SocketType.Stream + ProtocolType.Tcp = TCP协议通信
SocketType.Raw + ProtocolType.Icmp = Intermet控制包文协议
SocketType.Raw + ProtocolType.Raw = 简单的IP包通信
//TCP流套接字
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//UDP数据报套接字
Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Socket的常用属性
1.套接字的连接状态
if(socketTcp.Connected){}
2.获取套接字的类型
print(socketTcp.SocketType);
3.获取套接字的协议类型
print(socketTcp.ProtocolType);
4.获取套接字的寻址方案
print(socketTcp.AddressFamily);
5.从网络中获取准备读取的数据数据量
print(socketTcp.Available);
6.获取本机EndPoint对象(注:IPEndPoint继承EndPoint)
socketTcp.LocalEndPoint as IPEndPoint
7.获取远程EndPoint对像
socketTcp.RemoteEndPoint as IPEndPoint
Socket的常用方法
1.主要用于服务端
1-1:绑定IP和端口
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
1-2:设置客户端连接的最大数量
socketTcp.Listen(10);
1-3:等待客户端连入
socketTcp.Accept();
2.主要用于客户端
1-1:连接远程服务端
socketTcp.Connect(IPAddress.Parse("118.12.123.11"), 8080);
3.客户端服务端都会用的
2-1:同步发送和接收数据
socketTcp.Send();
2-2:异步发送和接收数据
socketTcp.SendAsync();
2-3:释放连接并关闭Socket,先与Close调用
socketTcp.Shutdown(SocketShutdown.Both);
2-4:关闭连接,释放所有Socket关闭资源
socketTcp.Close();