Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现非阻塞TCP服务器_Python_Tcp_Nonblocking - Fatal编程技术网

Python 实现非阻塞TCP服务器

Python 实现非阻塞TCP服务器,python,tcp,nonblocking,Python,Tcp,Nonblocking,我正在尝试实现一个TCP服务器,它在recv或sendall操作期间不会(可能)永远挂起 我认为为活动套接字指定超时就足够了,但情况似乎并非如此: 那么,我如何扩展代码以确保: recv在任何情况下都不会挂断 sendall在任何情况下都不会挂断(我不确定sendall是否可以挂断) 非常感谢您的任何建议 您需要的是select功能。 它需要3个参数;读列表、写列表、错误列表。 然后它返回三个值,每个值都是您输入的套接字列表,这些套接字可以被写入,也可以从中读取。(或者,如果您想检查是否存在

我正在尝试实现一个TCP服务器,它在recv或sendall操作期间不会(可能)永远挂起

我认为为活动套接字指定超时就足够了,但情况似乎并非如此:

那么,我如何扩展代码以确保:

  • 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 );