socket通信流程
根据进程在网络通信中使用的协议,可将socket通信方式分为两种:一种是面向连接、基于TCP协议的通信;另一种是面向无连接、基于UDP协议的通信。
以上两种通信方式都使用10.2.1小节中讲解的编程接口实现,这两种通信方式的流程大致相同,区别在于面向连接的流程在通信前需要先与对方套接字进行绑定。
当使用面向连接的方式进行通信时,服务器和客户机先各自创建socket文件,服务器端调用bind()函数绑定服务器端口地址;之后服务器端的socket通过接口listen()监听客户端;若客户端需要与服务器端进行交换,客户端会调用connect()函数,向已知的服务器地址端口发送连接请求,并阻塞等待服务器应答;服务器在收到客户端发来的connect()请求后,会调用accept()函数试图进行连接,若服务器端连接的进程数量未达到最大连接数,便成功建立连接,此后客户端解除阻塞,两端可正常进行通信,否则服务器忽略本次连接请求,继续监听客户端。最后当通信完成之后,双方各自调用close()函数,关闭socket文件,释放资源。
当使用面向无连接的方式进行通信时,服务器和客户机同样先各自创建自己的socket文件,再由服务器端调用bind()函数绑定服务器端口地址。之后通信双方可直接开始通信,需要注意的是,因为服务器和客户机并未建立连接,所以客户端再向服务器发送数据时,需额外指定服务器的端口地址,同样的,若服务器需要向客户端发送数据,服务器也需额外指定客户端的端口地址。通信结束之后,通信双方同样需要调用close()函数,关闭socket文件,释放资源。
如图1(a)、(b),分别为两种通信方式的流程示意图。
图1 通信流程示意图
无论是面向连接的通信还是面向非连接的通信,进行通信的双方都可以发送和接收数据。