SocketServer ThreadingTCPServer& Asyncore Dispatcher

时间:2012-09-20 10:15:23

标签: python sockets asyncsocket socketserver asyncore

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

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

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

所以我理解我需要一个asyncore实现,我会收到通知并读取一定数量的数据。如果没有数据在5秒的时间内发送,那么我想关闭那个连接(我知道如何干净地做到这一点)。 我找到了一些使用asyncore和套接字的例子,但没有使用SocketServer。那么,我该如何实现asyncore& threadingTCPserver? 可能吗? 有人做过吗?

1 个答案:

答案 0 :(得分:3)

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

sock.settimeout(1.0)

由于您使用SocketServer,因此您必须在socket中的某处找到基础SocketServer。请注意SocketServer将为您创建套接字,因此您无需自己创建套接字。

您可能已经定义了RequestHandlerSocketServer一起使用。看起来应该是这样的:

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