Python网络编程改良版服务端

在《Python中套接字实现服务端和客户端3-1》中提到服务端可以接收来自客户端的连接,并且创造新的套接字与客户端进行数据通信。此时的服务端只能与一个客户端进行数据通信,如果有多个客户端连接服务端,该怎么对服务端进行改良呢?

1 使用while循环处理客户端的连接

可以通过while循环接收客户端的连接,代码如图1所示。

Python网络编程改良版服务端_第1张图片

图1 与多个客户端通信

运行服务端后的效果如图2所示。

Python网络编程改良版服务端_第2张图片

图2 服务器运行效果

从图2中可以看出,经过改良后的服务端,可以和IP地址为“192.168.147.129”的Win7通信,也可以与IP地址为“192.168.147.1”的Win10通信。通信完成后,继续等待其它客户端的连接。

2 使用非阻塞方式处理客户端的连接

2.1 存在的问题及分析

在“1 使用while循环处理客户端的连接”中改良的服务端,有一个问题就是当客户端1成功连接了服务端,但是客户端1没有向服务端发送数据;此时客户端2连接服务端,虽然能够成功连接,服务端却没办法接收客户端2发送的数据,如图3、图4和图5所示。

图3 服务端界面

图4 客户端1界面

Python网络编程改良版服务端_第3张图片

图5 客户端2界面

从图3所示的服务端界面中可以看出,当服务端接收了客户端1(192.168.147.129)的连接后,代码会阻塞在recv()函数处,等待客户端1发送数据,如果客户端1一直没有发送数据,则服务端代码会一直阻塞,不会再继续运行。

2.2 套接字的非阻塞模式

可以将服务端中用于与客户端通信的套接字设置为非阻塞模式,这样当没有客户端发送数据时,服务端的recv()函数不会阻塞,代码会继续运行。

可以通过套接字类的setblocking()或者settimeout()将套接字设置为非阻塞,代码如图6所示。

Python网络编程改良版服务端_第4张图片

图6 将套接字设置为非阻塞

从图6中可以看出,第16行代码调用setblocking(),该函数的参数是False时表示非阻塞模式,True表示阻塞方式;也可以使用settimeout()函数,该参数表示等待时间,0.0表示等待0.0秒即不等待,代码直接向下运行;第17行代码指定了等待时间,也就是说,当前连接的客户端如果在5秒钟之内不发送数据,则服务端不再等待。

运行改良后的服务端,当有两个客户端连接时,其界面如图7所示。

Python网络编程改良版服务端_第5张图片

图7 改良后的服务端

从图7中可以看出,当客户端1(192.168.147.129)连接服务端后,在5秒钟之内没有发送数据,则服务端不再等待,继续监听其它客户端的连接。当客户端2(192.168.147.1)连接服务端时,服务端接收该连接,并且能够接收来自客户端2的数据。

你可能感兴趣的:(Python网络编程,Python,socket网络编程,套接字,setblocking,settimeout)