C# Socket入门

发布时间 2023-04-26 09:17:51作者: 真真真甜

1.什么是Socket

socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据;

套接字就是四元组,即源ip+端口port 目的ip+端口port,表示绝对唯一的连接;

Socket 是在应用层(Http、SSH、FTP)和传输层(TCP、UDP)之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信;

实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议;

 

2.Http与TCP/IP与Socket的关系

WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上;

HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口;

 

 

2.Socket流程

通过上面对Socket的理解,我们知道Socket编程将两个进程之间分为服务端和客户端;其各自的流程如下

服务器端:
第一步:建立一个用于通信的Socket对象
第二步:使用bind绑定IP地址和端口号
第三步:使用listen监听客户端
第四步:使用accept中断程序直到连接上客户端
第五步:接收来自客户端的请求
第六步:返回客户端需要的数据
第七步:如果接收到客户端已关闭连接信息就关闭服务器端

客户端:
第一步:建立一个用于通信的Socket对象
第二步:根据指定的IP和端口connet服务器
第三步:连接成功后向服务器端发送数据请求
第四步:接收服务器返回的请求数据
第五步:如果还需要请求数据继续发送请求
第六步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信

 

3.Socket编程

   3.1.服务端

   根据上面对服务端Socket流程的定义,首先需要创建服务端的Socket对象

Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

   其次是绑定本地的IP和端口号

ServerSocket.Bind(new IPEndPoint(ip,port));
或者
IPEndPoint ipEndPoint = new IPEndPoint(ip,port)
ServerSocket.Bind(ipEndPoint);

   然后让Socket侦听传入的连接,参数为指定侦听队列的容量

ServerSocket.Listen(10);

   接收连接并返回一个新的Socket,Accept会中断程序,直到有客户端连接,而Accept方法返回的Socket即是已经与客户端连接成功的套接字(Socket),用该套接字就可以与客户端进行消息的收发

Socket socket = ServerSocket.Accept();

    从客户端中读取数据

byte[] receive = new byte[1024];
int length = socket.Receive(receive);// length 接收字节数组长度

   发送数据到客户端

//Encoding.ASCII.GetBytes()将字符串转成字节
//byte[] message = Encoding.ASCII.GetBytes("Connect the Server"); //通信时实际发送的是字节数组,所以要将发送消息转换字节
byte[] message = Encoding.UTF8.GetBytes("Connect the Server");    //防止中文乱码使用该方法对字符串进行编码
socket.Send(message);

 3.2客户端

 创建一个客户端的Socket对象

Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

使用Socket的Connnect方法向服务端发送连接请求,Connect方法下重载的Connect(IP,Port)可以选择。

ClientSocket.Connect(iPEndPoint);

如果连接成功,则可以用Send方法向服务端发送消息

byte[] send = new byte[1024];
send = Encoding.UTF8.GetBytes(richTextBox_Send.Text);  //将文本内容转换成字节发送
ClientSocket.Send(send);  

也可以用Recive方法接收消息

byte[] receive = new byte[1024];
ClientSocket.Receive(receive);  //调用Receive()接收字节数据

最后在通信结束后关闭连接

ClientSocket.Close();   //关闭套接字

4.因为服务端的Accept方法会中断程序,所以可以通过线程,或者Socket提供的异步方法

 

 

参考文档

https://blog.csdn.net/weixin_49959955/article/details/123798500

https://blog.csdn.net/weixin_44201102/article/details/117224252