.net平台下C#socket通信(上)

时间:2021-08-25 08:55:20

完全是根本,新手可以随意看看,大牛可以*浏览页了,哈哈。

在开始介绍socket前先增补增补根本常识,在此根本上理解网络通信才会顺理成章,固然有根本的可以跳过去了。都是空话,进入正题。

  TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,别名网络通讯协议。简单来说:TCP控制传输数据,卖力发明传输的问题,一旦有问题就发出信号,要求从头传输,直到所有数据安适正确地传输到目的地,而IP是卖力给因特网中的每一台电脑界说一个地点,以便传输。从协议分层模型方面来讲:TCP/IP由:网络接口层(链路层)、网络层、传输层、应用层。它和OSI的七层布局以及对付协议族差别,下图简单暗示:

.net平台下C#socket通信(上)

.net平台下C#socket通信(上)

.net平台下C#socket通信(上)

注:上图左图:TCP/IP的四层布局对应OSI七层布局。

中间的图示:TCP/IP协议族在OSI七层中的位置及对应的成果。

上图右图:TCP/IP协议模块关系图。

现阶段socket通信使用TCP、UDP协议,相对应UDP来说,TCP则是对照安适不变的协议了。本文只涉及到TCP协议来说socket通信。首先讲述TCP/IP的三次握手,在握手根本上延伸socket通信的根基过程。

下面介绍对付应届生结业面试来说长短常熟悉的,同时也是最污名昭著的三次握手:

1 客户端发送syn报文随处事器端,并置发送序号为x。

2 处事器端接收到客户端发送的请求报文,然后向客户端发送syn报文,并且发送确认序号x+1,并置发送序号为y。

3 客户端受随处事器发送确认报文后,发送确认信号y+1,并置发送序号为z。至此客户端和处事器端成立连接。

.net平台下C#socket通信(上)

在此根本上,socket连接过程:

处事器监听:处事器端socket并不定位具体的客户端socket,而是处于期待监听状态,实时监控网络状态。

客户端请求:客户端clientSocket发送连接请求,方针是处事器的serverSocket。为此,clientSocket必需知道serverSocket的地点和端标语,进行扫描发出连接请求。

连接确认:当处事器socket监听到或者是受到客户端socket的连接请求时,处事器就响应客户真个请求,建议一个新的socket,把处事器socket发送给客户端,一旦客户端确认连接,则连接成立。

注:在连接确认阶段:处事器socket即使在和一个客户端socket成立连接后,还在处于监听状态,仍然可以接收到其他客户真个连接请求,这也是一对多孕育产生的原因。

下图简单说明连接过程:

.net平台下C#socket通信(上)

socket连接道理知道了,此处编写最根基最简单的socket通信:

处事器端:

int port = 6000; string host = "127.0.0.1"; IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port); Socket sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sSocket.Bind(ipe); sSocket.Listen(0); Console.WriteLine("监听已经打开,请期待"); //receive message Socket serverSocket = sSocket.Accept(); Console.WriteLine("连接已经成立"); string recStr = ""; byte[] recByte = new byte[4096]; int bytes = serverSocket.Receive(recByte, recByte.Length, 0); recStr += Encoding.ASCII.GetString(recByte, 0, bytes); //send message Console.WriteLine("处事器端获得信息:{0}", recStr); string sendStr = "send to client :hello"; byte[] sendByte = Encoding.ASCII.GetBytes(sendStr); serverSocket.Send(sendByte, sendByte.Length, 0); serverSocket.Close(); sSocket.Close();

客户端:

int port = 6000; string host = "127.0.0.1";//处事器端ip地点 IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(ipe); //send message string sendStr = "send to server : hello,ni hao"; byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); clientSocket.Send(sendBytes); //receive message string recStr = ""; byte[] recBytes = new byte[4096]; int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0); recStr += Encoding.ASCII.GetString(recBytes, 0, bytes); Console.WriteLine(recStr); clientSocket.Close();