Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间

您所在的位置:网站首页 pythonsocketserver Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间

Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间

2023-09-19 23:17| 来源: 网络整理| 查看: 265

我已经读了很多东西,但我仍然无法理解。我知道在使用原始套接字时该怎么做。以下工作正常,如果没有收到数据,1 秒后超时:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((HOST, PORT)) sock.listen(1) while 1: conn, addr = sock.accept() data = '' conn.settimeout(1) try: while 1: chunk = conn.recv(1024) data += chunk if not chunk: break print 'Read: %s' % data conn.send(data.upper()) except (socket.timeout, socket.error, Exception) as e: print(str(e)) finally: conn.close() print 'Done'

但是当尝试将 SocketServer.TCPServer 与 SocketServer.BaseRequestHandler 一起使用时尝试类似的操作(而不是 SocketServer.StreamRequestHandler 我知道如何设置超时)似乎并不那么微不足道。我没有找到设置接收数据超时的方法。考虑这个片段(不完整的代码):

class MyTCPHandler(SocketServer.BaseRequestHandler): def handle(self): data = '' while 1: chunk = self.request.recv(1024) data += chunk if not chunk: break if __name__ == "__main__": HOST, PORT = "0.0.0.0", 9987 SocketServer.TCPServer.allow_reuse_address = True server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()

假设客户端只发送 10 个字节。 while 循环运行一次,chunk 不为空,因此再次执行 self.request.recv() 但客户端没有更多数据要发送,recv() 无限期阻塞 ...

我知道我可以实现一个小协议(protocol),检查终止字符串/字符,检查消息长度等,但我真的想为不可预见的情况(例如客户端“消失”)实现超时。

我想设置并更新超时,即在每个 chunk 之后重置超时,这是慢速客户端所需的(尽管目前这是次要问题) ).

提前致谢

最佳答案

您可以使用 SocketServer.BaseRequestHandler.request.settimeout() 执行与原始套接字相同的操作。

例如:

class MyTCPHandler(SocketServer.BaseRequestHandler): def handle(self): self.request.settimeout(1) ...

在这种情况下,如果完成时间超过 1 秒,self.request.recv() 将终止。

关于Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21810151/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3