Python 实现非阻塞TCP服务器
我正在尝试实现一个TCP服务器,它在recv或sendall操作期间不会(可能)永远挂起 我认为为活动套接字指定超时就足够了,但情况似乎并非如此: 那么,我如何扩展代码以确保:Python 实现非阻塞TCP服务器,python,tcp,nonblocking,Python,Tcp,Nonblocking,我正在尝试实现一个TCP服务器,它在recv或sendall操作期间不会(可能)永远挂起 我认为为活动套接字指定超时就足够了,但情况似乎并非如此: 那么,我如何扩展代码以确保: recv在任何情况下都不会挂断 sendall在任何情况下都不会挂断(我不确定sendall是否可以挂断) 非常感谢您的任何建议 您需要的是select功能。 它需要3个参数;读列表、写列表、错误列表。 然后它返回三个值,每个值都是您输入的套接字列表,这些套接字可以被写入,也可以从中读取。(或者,如果您想检查是否存在
- recv在任何情况下都不会挂断
- sendall在任何情况下都不会挂断(我不确定sendall是否可以挂断)
非常感谢您的任何建议 您需要的是
select
功能。
它需要3个参数;读列表、写列表、错误列表。
然后它返回三个值,每个值都是您输入的套接字列表,这些套接字可以被写入,也可以从中读取。(或者,如果您想检查是否存在错误,则已发生错误。)
你好谢谢你的回答。这是否也注意到sendall不会挂断?我是否不需要将活动套接字设为非阻塞?您想将
发送所有
设置为非阻塞模式,但在下次写入之前,请确保使用选择
检查是否可以写入。您不需要将套接字设为非阻塞。Select告诉zou是否存在某些内容,然后您就可以开始读/写。您希望进入非阻塞模式的原因是,在进入程序流之前,您不必等待发送大量数据。但是,使用Select时,如果客户端崩溃,我是否会遇到服务器阻塞的问题,而且没有正确关闭插座?如果崩溃发生在select操作之后…请查看
rl , wl , el = select( [ serversocket , clientsocket ] , [] , [] );
for e in rl:
if e == serversocket:
acceptConnection( serversocket );
else:
readFromClient( clientsocket );