UN2L1——Socket的重要API
UN2L1——Socket的重要API
本章代码关键字
1 | System.Net.Sockets //Socket所在命名空间 |
Socket套接字
它是C#提供给我们用于网络通信的一个类(在其它语言当中也有对应的Socket类)
类名:Socket
命名空间:System.Net.Sockets
TCP和UDP两种长连接通信方案都是基于Socket套接字的
我们之后只需要使用其中的各种方法,就可以进行网络连接和网络通信了
这里必须掌握的内容就是如何声明TCP和UDP的Socket
套接字
Socket套接字是支持TCP/IP网络通信的基本操作单位,一个套接字对象包含以下关键信息:
- 本机的IP地址和端口
- 对方主机的IP地址和端口
- 双方通信的协议信息
一个Socket
对象表示一个本地或者远程套接字信息,它可以被视为一个数据通道
这个通道连接与客户端和服务端之间,数据的发送和接受均通过这个通道进行
一般在制作长连接游戏时,我们会使用Socket套接字作为我们的通信方案,我们通过它连接客户端和服务端,通过它来收发消息
你可以把它抽象的想象成一根管子,插在客户端和服务端应用程序上,通过这个管子来传递交换信息
Socket的类型
Socket
套接字有3种不同的类型
-
流套接字
主要用于实现TCP通信,提供了面向连接、可靠的、有序的、数据无差错且无重复的数据传输服务
-
数据报套接字
主要用于实现UDP通信,提供了无连接的通信服务,数据包的长度不能大于32KB,不提供正确性检查,不保证顺序,可能出现重发、丢失等情况
-
原始套接字(不常用,不深入讲解)
主要用于实现IP数据包通信,用于直接访问协议的较低层,常用于侦听和分析数据包
通过Socket
的构造函数,我们可以申明不同类型的套接字,Socket
的构造函数有三种,我们主要使用第三种重载
1 | public Socket(SocketInformation socketInformation); |
-
参数一:
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网际组管理协议 -
Ggp
—— 网关到网关协议 -
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
= Internet控制报文协议(了解) -
SocketType.Raw
+ProtocolType.Raw
= 简单的IP包通信(了解)
我们必须要掌握:
-
TCP流套接字
1
Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
UDP数据报套接字
1
Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Socket的常用属性
-
套接字的连接状态
1
if(socketTcp.Connected) { }
-
获取套接字的类型
1
print(socket.SocketType);
-
获取套接字的协议类型
1
print(socket.ProtocolType);
-
获取套接字的寻址方案
1
print(socket.AddressFamily);
-
从网络中获取准备读取的数据数据量
返回的是当前有多少字节准备读取
1
print(socket.Available);
-
获取本机
EndPoint
对象(注意 :IPEndPoint
继承EndPoint
)1
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
-
获取远程
EndPoint
对象1
IPEndPoint RemoteEndPoint = socket.RemoteEndPoint as IPEndPoint;
Socket的常用方法
-
主要用于服务端
-
绑定IP和端口
1
socket.Bind(ipPoint);
-
设置客户端连接的最大数量
1
socket.Listen(10);
-
等待客户端连入
执行该方法会阻塞线程,直到有客户端连入
客户端连入后会返回与该客户端连接的socket
对象,通过该对象来收发该客户端数据1
socket.Accept();
-
-
主要用于客户端
-
连接远程服务端
执行该方法会阻塞线程,直到连接超时或失败
1
socket.Connect(IPAddress.Parse("118.12.123.11"), 8080);
-
-
客户端服务端都会用的
-
同步发送和接收数据
-
TCP同步发送数据
传入字节数组
byte[]
形式的数据,该方法会阻塞线程1
socket.Send()
-
TCP同步接收数据
返回字节数组
byte[]
形式的数据,该方法会阻塞线程1
socket.Receive()
-
UDP同步接受发送数据
详细请见:UDP同步收发消息API
-
-
异步发送和接收数据
详细请见:TCP异步通信常用方法
-
释放连接并关闭Socket,先于
Close
调用该方法不可逆转,一旦关闭就不能重新开启,传入
SocketShutdown
枚举,枚举各个类型含义如下:-
SocketShutdown.Send
:停用在此 socket 上发送数据。 -
SocketShutdown.Receive
:停用在此 socket 上接收数据。 -
SocketShutdown.Both
:停用在此 socket 上发送和接收数据。
1
sockets.Shutdown(SocketShutdown.Both)
-
-
关闭连接,释放所有Socket关联资源
1
socket.Close()
-