代码之家  ›  专栏  ›  技术社区  ›  Ælex

SocketServer线程TCPServer和异步调度程序

  •  2
  • Ælex  · 技术社区  · 12 年前

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

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

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

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   Hans Then    12 年前

    您也可以在 recv 呼叫,如下所示:

    sock.settimeout(1.0)
    

    自从你使用 SocketServer ,你必须找到 socket 在某个地方 套接字服务器 。请注意 套接字服务器 将为您创建套接字,所以没有必要自己这样做。

    您可能已经定义了 RequestHandler 与你的 套接字服务器 。它应该是这样的:

    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