在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。
然而,在你的代码中犯了一些错误:
- 的
target
参数必须是一个callable
对象不是“已调用”对象。 - 要处理许多请求,您需要构建一个线程池。如果你只使用一个线程,如果它是主线程或“子”线程,则不会有任何区别。
你不应该循环的
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()
这行'thread.start_new_thread(server.serve_forever(),())'应该只是'server.serve_forever()'。 – smeso
@Faust谢谢我编辑了代码。 serve_forever()也可以工作。 –
恩,谢谢。文档中的示例对于像我这样的新手来说很复杂。所以,我用你的想法,现在我的程序按预期工作。 –