Socket是什么
Socket网络编程接口,是用来进行网络通信的。客户端与服务器进行一次网络通信,肯定要建立连接,那么在连接建立时,在客户端与服务器端都会产生一个socket实例。客户端和服务器可以通过该实例进行信息的发送与接收。
Java网络编程第四版定义
Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。
Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个socket实例。操作这个实例,完成所需的会话。
Socket 允许程序员将网络连接看作是另外一个可以读写字节的流(既然是流,就肯定有两端)。
socket的7个基本操作:
1.连接远程机器;
2.发送数据;
3.接受数据;
4.关闭连接;
5.绑定端口;
6.监听入站数据;
7.在绑定端口上接受来自远程机器的连接。
Java socket类(客户端、服务器都可以使用)提供1-4操作方法,5-7操作方法由ServerSocket类实现(仅服务器等待客户端连接)。
ServerSocket是什么
客户端与服务器对话,除了有客户端socket,还需要一个等待客户端连接的服务端socket。服务器socket的任务就是坐在电话旁的等电话。
从技术上讲,服务器Socket在服务器上运行,监听入站TCP连接。每个服务器Socket监听服务器机器上的一个特定端口。当远程主机上的一个客户端尝试连接这个端口时,服务器就被唤醒,协商建立客户端和服务器之间的连接,并返回一个常规的Socket对象,表示两台主机之间的Socket。
简单来说,服务器socket等待连接,客户端socket发起连接,当ServerSocket建立连接后,服务器使用一个常规socket对象传输数据。
客户端和服务端通信过程
套接字其实只是一个引用(一个对象ID),套接字对象实际上是放在操作系统内核中。这个套接字对象内部有两个重要的缓冲结构,一个是读缓冲(read buffer),一个是写缓冲(write buffer),它们都是有限大小的数组结构。
客户端发送数据到服务器流程
对客户端的socket写入字节数组时(序列化后的请求消息对象req),是将字节数组拷贝到内核区套接字对象的write buffer中,内核网络模块会有单独的线程负责不停地将write buffer的数据拷贝到网卡硬件,网卡硬件再将数据送到网线,经过路由器交换机,最终送达服务器的网卡硬件。
服务器内核的网络模块也会有单独的线程不停地将收到的数据拷贝到套接字的read buffer中等待用户层来读取。最终服务器的用户进程通过socket引用的read方法将read buffer中的数据拷贝到用户程序内存中进行反序列化成请求对象进行处理。
服务器发送数据到客户端流程
服务器把处理后的响应对象按上述相反流程发送给客户端。