Я участвую в создании Python-сетей, и я вспомнил, что назад, когда я учил себя поточно, я наткнулся на эту страницу, поэтому я скопировали скрипты, обновили их для Python 3.1.1 и запустили их. Они отлично работали.
Затем я сделал несколько изменений. Моя цель - сделать что-то простое:
- Клиент распиливает целое число и отправляет его на сервер.
- Сервер получает маринованное целое число, распаковывает его, удваивает, затем рассосывает и отправляет обратно клиенту.
- Клиент получает маринованное (и удвоенное) целое число, распаковывает его и выводит.
Здесь сервер:
import pickle
import socket
import threading
class ClientThread(threading.Thread):
def __init__(self, channel, details):
self.channel = channel
self.details = details
threading.Thread.__init__ ( self )
def run(self):
print('Received connection:', self.details[0])
request = self.channel.recv(1024)
response = pickle.dumps(pickle.loads(request) * 2)
self.channel.send(response)
self.channel.close()
print('Closed connection:', self.details [ 0 ])
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 2727))
server.listen(5)
while True:
channel, details = server.accept()
ClientThread(channel, details).start()
И вот клиент:
import pickle
import socket
import threading
class ConnectionThread(threading.Thread):
def run(self):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2727))
for x in range(10):
client.send(pickle.dumps(x))
print('Sent:',str(x))
print('Received:',repr(pickle.loads(client.recv(1024))))
client.close()
for x in range(5):
ConnectionThread().start()
Сервер работает нормально, и когда я запускаю клиент, он успешно соединяется и начинает отправлять целые числа и получать их обратно в два раза, как ожидалось. Однако очень быстро это исключение:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python30\lib\threading.py", line 507, in _bootstrap_inner
self.run()
File "C:\Users\Imagist\Desktop\server\client.py", line 13, in run
print('Received:',repr(pickle.loads(client.recv(1024))))
socket.error: [Errno 10053] An established connection was aborted by the softwar
e in your host machine
Сервер продолжает работать и получает соединения просто отлично; только сбой клиента. Что вызывает это?
EDIT: я получил клиент, работающий со следующим кодом:
import pickle
import socket
import threading
class ConnectionThread(threading.Thread):
def run(self):
for x in range(10):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2727))
client.send(pickle.dumps(x))
print('Sent:',str(x))
print('Received:',repr(pickle.loads(client.recv(1024))))
client.close()
for x in range(5):
ConnectionThread().start()
Однако я все еще не понимаю, что происходит. Разве это не просто открытие и закрытие сокета кучу раз? Не должно быть ограничений по времени для этого (вы не сможете открыть сокет так вскоре после его закрытия)?