Я сейчас пытаюсь научиться работать с сетью python. Я действительно новичок в этой топи c, поэтому я скопировал некоторые примеры откуда-то вроде здесь
Я хочу добиться непрерывной передачи данных с помощью TCP. Это означает, что я хочу отправлять данные, пока выполняется какое-то условие. Поэтому я немного изменил пример этого кода ниже:
Моя установка - Win10 с Python 3.8
Моя client.py
скопированная и измененная форма выше:
# Echo client program
import socket
HOST = '192.168.102.127' # The remote host
PORT = 21
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
i=0 #For counting how often the string was sent
while True: #for testing this is forever
s.sendall(b'Hello, world')
data = s.recv(1024)#
print(i)
i=i+1
print('Received', repr(data))
My server.py
:
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 21
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
Я получаю ошибку
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine
после i=5460
(в нескольких попытках) на стороне клиента и
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
на стороне сервера
Чем длиннее мое текстовое сообщение, тем меньше сообщений было отправлено до ошибки.
Это наводит меня на мысль, что я отправил данные в какой-то буфер, который (over-) записывается до тех пор, пока не будет выдана ошибка. При поиске возможных решений я нашел только разные реализации, которые не покрывали мою проблему или использовали другое программное обеспечение.
Как указано в некоторых ответах на похожие вопросы , я отключил брандмауэр и остановил свой антивирус, но без заметной разницы. При поиске ошибки также возможны ошибки протокола, но я не ожидаю, что это станет проблемой. Читая документацию по сокетам / TCP, я где-то обнаружил, что TCP на самом деле не предназначен для такого рода проблем, а скорее для
client connects to server
|
V
client sends request to server
|
V
server sends request answer
|
V
server closes connection.
Это действительно так? Но я не могу поверить, что для каждой отправляемой информации должен быть подключен новый сокет, как в этом вопросе . Это решение также очень медленно. Но если это так, что я могу использовать альтернативно?
Чтобы проиллюстрировать более широкую картину:
У меня есть какой-то другой код, который дает мне данные о состоянии (текст) при 500 Гц. В Python я обрабатываю эти данные и отправляю обработанные данные в Arduino со щитом Ethe rnet. Эти данные являются данными в режиме реального времени, поэтому мне нужно, чтобы данные отправлялись в arduino как можно быстрее. Здесь клиент - Python, а Сервер - это Arduino с модулем Ethernet
. Связь и все работает нормально, моя проблема только в непрерывной отправке данных.