Python网络编程改良版服务端

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

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

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

图1 与多个客户端通信

运行服务端后的效果如图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界面

图5 客户端2界面

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

2.2 套接字的非阻塞模式

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

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

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

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

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

图7 改良后的服务端

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值