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
标签:Socket,C#,IP,入门,TCP,new,byte,客户端 From: https://www.cnblogs.com/M-MAKI/p/17353302.html