Создание многопоточного сервера с использованием инфраструктуры SocketServer в python
Этот вопрос решен. Рабочий код приведен ниже в этом сообщении.
Проблема:
В настоящее время я знаком с сетевым программированием с 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()
Спасибо
Update:
Следующий код - это решение:
#!/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()
Ответы
Ответ 1
Это намного проще, чем вы думаете:
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
Вместо того, чтобы просто использовать ThreadedTCPServer
вместо TCPServer
вместо TCPServer
.
Для получения дополнительной информации вы можете прочитать несколько документов.
Однако в вашем коде вы допустили некоторые ошибки:
- Аргумент
target
должен быть callable
объектом, а не "уже вызванным" объектом.
- Чтобы обрабатывать множество запросов, вам нужно создать пул потоков. Если вы используете только один поток, это не имеет никакого значения, если это основной поток или "дочерний" поток.
Ответ 2
Ну, спасибо @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()
Ответ 3
Не следует ли вы зацикливать
server = SocketServer.TCPServer(('',1520), service)
t = Thread(target=server.serve_forever())
t.start()
Просто догадаться.