Выбор / Thread Multiclient Server в Python зависает после получения первого сообщения

Я хотел написать сервер, который сможет обрабатывать несколько клиентов, петь select и threads .

Я знаю, как писать сервер только с threads или только с select . Теперь я хотел смешать их вместе. Но, похоже, я потерпел неудачу.

Сервер:

 import threading import socket import select class Client(threading.Thread): ''' Multi-threading clients. ''' def __init__(self): threading.Thread.__init__(self) pass def setup(self, __client, __address): self.client = __client self.address = __address def connect(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def run(self): print self.client.__class__ data = self.client.recv(1024) if data: self.client.sendall(data) else: print "Error:", self.address class Server(object): ''' Threading server ''' def __init__(self): ''' Constructor ''' self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('127.0.0.1', 9876)) def run(self): self.server.listen(10) inputs = [self.server] while 1: inready, outready, excready = select.select(inputs, [], []); for s in inready: if s == self.server: sock, address = self.server.accept(); client = Client() client.setup(sock, address) client.start() self.server.close() if __name__ == '__main__': server = Server() server.run() 

Клиент:

 import socket import sys port = 9876 size = 1024 s = None try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = socket.gethostname() s.connect(('127.0.0.1', port)) except socket.error, (value, message): if s: s.close() print "Could not open socket: " + message sys.exit(1) while True: data = raw_input('> ') s.sendall(data) data = s.recv(size) print "Server sent: %s " % data s.close() 

Клиент отправляет и получает только одно сообщение, а затем Im не может отправлять больше сообщений. Зачем? Как это улучшить? Спасибо.

Изменить: обнаружена одна ошибка. В методе запуска клиента отсутствовала петля:

 import threading import socket import select class Client(threading.Thread): ''' Multi-threading clients. ''' def __init__(self): threading.Thread.__init__(self) pass def setup(self, __client, __address): self.client = __client self.address = __address def connect(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def run(self): while True: print self.client.__class__ data = self.client.recv(1024) if data: self.client.sendall(data) else: print "Error:", self.address self.client.close() class Server(object): ''' Threading server ''' def __init__(self): ''' Constructor ''' self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('127.0.0.1', 9876)) def run(self): self.server.listen(10) inputs = [self.server] while 1: inready, outready, excready = select.select(inputs, [], []); for s in inready: if s == self.server: sock, address = self.server.accept(); client = Client() client.setup(sock, address) client.start() self.server.close() if __name__ == '__main__': server = Server() server.run() 

Но теперь, когда клиент отключается, у меня есть ошибка на стороне сервера. Как справиться с этой ошибкой?

 Exception in thread Thread-4: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner self.run() File "/home/testserver.py", line 25, in run data = self.client.recv(1024) File "/usr/lib/python2.7/socket.py", line 174, in _dummy raise error(EBADF, 'Bad file descriptor') error: [Errno 9] Bad file descriptor