Ваш сервер читает с клиента ровно один раз и получает до 72 байт, а затем закрывает соединение.Если клиент может отправить все 10 сообщений достаточно быстро, он не получит ошибку.Прочтите об алгоритме Nagle , который:
запрещает [s] отправку новых сегментов TCP, когда новые исходящие данные поступают от пользователя, если ранее переданные данные по соединению остаются неподтвержденными.
Ваш сервер никогда не получит все сообщения (всего 91 байт), но клиент не выдаст ошибку, если он все их отправит.
Небольшое изменение на сервере делаетубедитесь, что он получает все данные (независимо от задержки), ожидая, пока клиент не закроет соединение:
with connection:
while True:
data = connection.recv(72)
if not data: break # empty data means client closed connection.
print('Client says "{}"'.format(data))
Он по-прежнему не будет получать сообщения по одному.TCP - это потоковый протокол, поэтому сообщения объединяются вместе.Вам нужно добавить буферизацию и средство для извлечения из нее только полных сообщений.Пример (Python 3.6 +):
client.py
import socket
host = '127.0.0.1'
port = 65432
with socket.socket() as s:
s.connect((host, port))
for i in range(10):
# Use newline as message delimiter.
s.sendall(f'message {i+1}\n'.encode())
server.py
import socket
with socket.socket() as s:
s.bind(('127.0.0.1', 65432))
s.listen()
while True:
connection, address = s.accept()
with connection:
data = b''
while True:
chunk = connection.recv(16)
if not chunk: break # client closed connection
data += chunk # buffer input
while b'\n' in data: # break off messages and display
msg,_,data = data.partition(b'\n')
print(f'Client says "{msg.decode()}"')
if data:
print(f'Incomplete message: {data}')
Вывод:
Client says "message 1"
Client says "message 2"
Client says "message 3"
Client says "message 4"
Client says "message 5"
Client says "message 6"
Client says "message 7"
Client says "message 8"
Client says "message 9"
Client says "message 10"