在Python中使用SocketServer框架创建多线程服务器

问题描述:

这个问题已解决。工作代码也在这篇文章中给出。在Python中使用SocketServer框架创建多线程服务器

问题: 我目前越来越熟悉与Python的网络编程。我目前正在使用SocketServer框架。现在我的问题是如何创建多线程服务器,可以接受多个使用SocketServer模块的客户端?我基本上试图用这个代码

t = Thread(target=server.serve_forever()) 
t.start() 

目前在我的程序中,服务器只接受一个客户端。我使用netcat连接到服务器。第一个客户端连接到服务器没有任何问题。如果我尝试从第二个客户端连接到服务器,客户端只是一直等待连接。一旦断开第一个客户端,第二个客户端就会自动与服务器连接。在我看来,多线程不工作。我无法弄清楚我错在哪里。任何提示都会很棒。 我的代码如下:

#!/usr/bin/env python 

import SocketServer 
from threading import Thread 


class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 



server = SocketServer.TCPServer(('',1520), service) 
t = Thread(target=server.serve_forever()) 
t.start() 

感谢

更新: 下面的代码解决方案:

#!/usr/bin/env python 


import SocketServer 
from threading import Thread 

class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 

t = ThreadedTCPServer(('',1520), service) 
t.serve_forever() 

它比你更简单的认为:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 

比你只需要使用新的ThreadedTCPServer而不是TCPServer

欲了解更多信息,你可以阅读some doc

然而,在你的代码中犯了一些错误:

  1. target参数必须是一个callable对象不是“已调用”对象。
  2. 要处理许多请求,您需要构建一个线程池。如果你只使用一个线程,如果它是主线程或“子”线程,则不会有任何区别。
+0

恩,谢谢。文档中的示例对于像我这样的新手来说很复杂。所以,我用你的想法,现在我的程序按预期工作。 –

你不应该循环的

server = SocketServer.TCPServer(('',1520), service) 
t = Thread(target=server.serve_forever()) 
t.start() 

只是一个猜测..

好感谢@Faust的意见。下面给出的代码现在按照预期工作。

#!/usr/bin/env python 

import SocketServer 
from threading import Thread 


class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 


server = ThreadedTCPServer(('',1520), service) 
server.serve_forever() 
+1

这行'thread.start_new_thread(server.serve_forever(),())'应该只是'server.serve_forever()'。 – smeso

+0

@Faust谢谢我编辑了代码。 serve_forever()也可以工作。 –