单个服务器对多个客户端简单通讯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011599639/article/details/62864054

1.      非阻塞通信方式

对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。缺省情况下, 文件描述符处于阻塞状态。在实现逻辑上, server 需要轮流查询与各client 建立的 socket,一旦可读就将该 socket 中的字符读出来并向所有其他client 或者指定的client发送。并且server 还要随时查看是否有新的 client 试图建立连接,这样, 如果 server 在任何一个地方阻塞了, 其他client 发送的内容就会受到影响,得不到服务器的及时响应。新的client试图建立连接也会受到影响。所以在这里不能使用缺省的阻塞的文件工作方式,而需要将文件的工作方式变成非阻塞方式。

2.      多客户端通信

a)      主线程

以main函数作为主线程,初始化WindowsSockets动态库,并初始化动态库,创建服务器套接字,设置为非阻塞模式,绑定IP地址和端口号,主循环不断的监听客户端的连接请求,当监听到客户端连接请求后创建子套接字进程,能够实现同时连接多个客户端。等待所有创建的子套接字线程结束后,退出服务器,释放动态库,服务结束。


b)     子套接字线程

打印输出连接的子套接字的IP地址和端口号,并把该子套接字添加到类容器中,创建该套接字的接收和发送线程。利用标识符检测客户端和服务器端是否出现连接异常或者客户端是否已经退出,如果检测到标识符被置位,则关闭该子套接字。

c)      接收和发送线程

为了实现数据的全双工通信,采用了接收和发送双线程,为了便于标识,当客户端向服务器端发送数据时,先打印出该服务器对应的IP地址和端口号,再打印输出服务器端接收到的数据。服务器端想要发送数据时,首先要输入用于识别目标客户端的关键字,建立连接的发送源和接收端。然后再发送数据。为了保证发送和接收数据稳定性,可靠性,加入互斥锁。


猜你喜欢

转载自blog.csdn.net/u011599639/article/details/62864054