Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间 |
您所在的位置:网站首页 › pythonsocketserver › Python:如何在 SocketServer.TCPServer 中设置接收数据的超时时间 |
我已经读了很多东西,但我仍然无法理解。我知道在使用原始套接字时该怎么做。以下工作正常,如果没有收到数据,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 |