学科分类
目录

socket通信流程

根据socket的类型,网络通信又分为基于TCP协议、面向连接的通信和基于UDP、面向无连接的通信。

1. 面向连接的通信

面向连接的通信类似日常生活中的电话服务:在电话服务中,接电话的一方需要保持手机畅通,以便可随时接收他人发送的通话请求;在电话连通之后,通话的双方可以开始交换数据。面向连接的socket通信流程如图1所示。

img

图1 面向连接的socket通信

结合图1,在面向连接的通信中,服务器的工作流程如下:

(1)调用socket()方法创建socket;

(2)调用bind()方法将服务器进程与端口地址绑定;

(3)调用listen()方法开启服务器监听,等待客户端的连接请求;

(4)当有客户端请求递达时,调用accept()方法尝试与客户端进行连接;

(5)若连接成功,则处理客户端请求,并将处理结果反馈给客户端;

(6)继续等待客户端请求并进行处理;

(7)通信结束后,调用close()方法关闭socket。

需要说明的是,由于服务器需要一直保持运行,所以除非有特殊情况,否则服务器端永远不会关闭监听的socket。

结合图1,在面向连接的通信中,客户端进程的工作流程如下:

(1)调用socket()方法创建socket;

(2)调用connect()方法向服务端发起连接;

(3)连接建立后,调用send()方法向服务器发送数据;

(4)接收服务器反馈的处理结果;

(5)若仍有需求则继续进行数据发送和接收操作,否则关闭socket并向服务器发送结束通知。

2. 面向非连接的通信

面向非连接的socket通信与生活中的邮件投递类似,接收邮件的一方无需一直等待发送邮件的一方发起连接请求;发送邮件的一方只需知道接收方的收件地址,便可直接投递邮件。面向非连接的通信流程如图2所示。

img

图2 面向非连接的socket通信

图2中所示的面向非连接的socket通信流程与图1中所示的面向连接的socket通信流程大致相同,区别在于面向非连接的通信中,客户端不再发起连接请求,而是使用sendto()方法向指定的接收方发送数据;服务器则使用recvfrom()方法接收数据,并可以使用sendto()方法将请求的处理结果反馈到客户端。

点击此处
隐藏目录