2

我想为使用 SocketServer 模块的服务器的请求处理程序中的单个连接添加超时。

首先让我说这是我第一次尝试使用 Python 进行网络编程。我对 SocketServer.BaseRequestHandler 和 SocketServer.ThreadingTCPServer 和 SocketServer.TCPServer 进行了子类化,并设法创建了两个具有一些基本线程 TCP 功能的类。

但是我希望我的传入连接超时。试图覆盖任何内置的 SocketServer 超时值和方法都不起作用,因为文档说这仅适用于分叉服务器。我设法创建了一个在 X 秒后触发的计时器线程,但是由于 Handler 线程中阻塞 recv 调用的性质,这没有用,因为我将被迫杀死它,这是我真正的想避免。

所以我的理解是我需要一个异步实现,在那里我得到通知并读取一定数量的数据。如果在 5 秒内没有发送任何数据,可以说,我想关闭该连接(我知道如何干净地做到这一点)。我发现了一些将 asyncore 与套接字一起使用的示例,但没有一个使用 SocketServer。那么,我该如何实现 asyncore 和 threadingTCPserver 呢?是否可以?有人做过吗?

4

1 回答 1

3

您还可以设置recv通话超时,如下所示:

sock.settimeout(1.0)

既然你使用SocketServer了,你就必须socketSocketServer. 请注意,这SocketServer将为您创建套接字,因此您无需自己创建。

您可能已经定义了一个RequestHandler与您的SocketServer. 它应该看起来像这样:

class RequestHandler(SocketServer.BaseRequestHandler):
    def setup(self):
         # the socket is called request in the request handler
         self.request.settimeout(1.0)

    def handle(self):
         while True:
             try: 
                 data = self.request.recv(1024)
                 if not data:
                      break # connection is closed
                 else:
                      pass  # do your thing
             except socket.timeout:
                 pass # handle timeout
于 2012-09-20T10:21:07.000 回答