У вас есть несколько проблем с этим кодом сервера.
Вы закрываете прослушиватель после первого подключения
Вы не зацикливаетесь на дополнительных соединениях
import time
from multiprocessing.connection import Listener
from threading import Thread
_threads = []
def start_server_thread():
global _threads
_threads.append(Thread(target=threaded_server))
_threads[-1].daemon = True
_threads[-1].start()
def threaded_server():
while True:
conn = _listener.accept()
print str(conn.recv())
conn.close()
if __name__ == "__main__":
_listener = Listener(('localhost', 5555), authkey='secret_password')
start_server_thread()
while True:
time.sleep(1)
_listener.close()
Отказ от ответственности: я думаю, что это довольно грязный способ написать сервер. Я публикую только исправление для вашего текущего кода: -)
Вот слегка очищенная версия того же кода. Все еще не на 100% идеален, но чище, я думаю?
import time
from multiprocessing.connection import Listener
from threading import Thread
class Server(Listener):
def __init__(self, *args, **kwargs):
super(Server, self).__init__(*args, **kwargs)
self._thread = None
self._stopping = False
def serve(self):
self._stopping = False
self._thread = Thread(target=self._serve)
self._thread.daemon = True
self._thread.start()
def _serve(self):
threads = []
while not self._stopping:
conn = self.accept()
t = Thread(target=self.handleConnection, args=(conn,))
t.start()
threads.append(t)
def stop(self):
if not self._stopping:
print "Stopping."
self._stopping = True
self._thread.join(3)
self.close()
def handleConnection(self, conn):
print str(conn.recv())
conn.close()
if __name__ == "__main__":
listener = Server(('localhost', 5555), authkey='secret_password')
listener.serve()
try:
while True:
time.sleep(1)
except KeyboardInterrupt, e:
listener.stop()