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

时间:2013-12-23 14:15:31

标签: python multithreading sockets

这个问题已经解决了。工作代码也在下面的帖子中给出。

问题: 我目前熟悉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()

3 个答案:

答案 0 :(得分:6)

这比你想象的要简单得多:

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

您只需使用新的ThreadedTCPServer代替TCPServer

有关详细信息,请参阅some doc

但是在你的代码中你犯了一些错误:

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

答案 1 :(得分:1)

非常感谢@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()

答案 2 :(得分:-1)

你不应该循环

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

只是一个猜测..