2012-09-20 32 views
2

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

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

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

因此,我的理解是,我需要一个asyncore实现,在那里获得通知并读取一定数量的数据。如果在5秒内没有发送任何数据,可以说,我想关闭该连接(我知道如何干净地做到这一点)。 我发现了一些使用socket的asyncore的例子,但是没有一个使用SocketServer。那么,我怎样才能实现asyncore & threadingTCPserver? 这可能吗? 有没有人做过?

+1

*您可*这样做事,但我建议探索一种更简单,更有效的方法 - http://twistedmatrix.com/ - 欢迎到Python网络世界编程! :) –

+0

让 - 保罗卡尔德龙感谢您的链接。我以前见过。在正常情况下,我会选择twistedmatrix,但这是一个非常注重安全性并且不需要开源或第三方库的客户的项目。 –

+0

这非常可悲,逻辑无效(Python是开源和第三方)。不过,祝你的项目好运。 –

回答

3

您还可以设置一个超时的recv调用,就像这样:

sock.settimeout(1.0) 

由于您使用SocketServer,你必须找到在某处SocketServer底层socket。请注意,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 
+0

我不能让这个工作很伤心。我试过(在请求处理程序中): sock = self.server.socket(socket.AF_INET,socket.SOCK_STREAM) sock = self.request.socket(socket.AF_INET,socket.SOCK_STREAM) 每次我这样做,连接失败 –

+1

对不起,我不清楚。我会在一分钟内澄清。 –

+0

非常感谢!这是与ForkingTCPServer合作,完全符合我的要求。将使用ThreadingTCPServer进行测试,看看它是否也可以在那里使用。再次谢谢你 !!! –