Python 温诺10053。如何继续通过TCP发送数据;“永远”;
我目前正在尝试学习使用python进行联网。我对这个话题真的很陌生,所以我从类似的地方复制了一些例子 我想用TCP实现连续的数据传输。这意味着只要满足某些条件,我就要发送数据。因此,我稍微修改了下面的代码示例: 我的设置是使用Python 3.8的Win10 MyPython 温诺10053。如何继续通过TCP发送数据;“永远”;,python,sockets,networking,tcp,Python,Sockets,Networking,Tcp,我目前正在尝试学习使用python进行联网。我对这个话题真的很陌生,所以我从类似的地方复制了一些例子 我想用TCP实现连续的数据传输。这意味着只要满足某些条件,我就要发送数据。因此,我稍微修改了下面的代码示例: 我的设置是使用Python 3.8的Win10 Myclient.py复制并修改了上述表格: # Echo client program import socket HOST = '192.168.102.127' # The remote host PORT = 21
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))
Myserver.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]主机中的软件中止了已建立的连接
在客户端的i=5460
(多次尝试)之后,以及
ConnectionResetError:[WinError 10054]服务器端的远程主机强制关闭了现有连接
我的短信越长,出错前发送的短信就越少
这使我相信我将数据发送到某种缓冲区,在抛出错误之前,缓冲区会被(过度)写入。
在寻找可能的解决方案时,我只找到了不同的实现,这并没有解决我的问题或使用其他软件
正如在一些类似问题的答案中所述,我禁用了防火墙并停止了杀毒,但没有明显的区别。
在查找错误时,也可能存在协议错误,但我不认为这是一个问题。
在阅读socket/TCP文档时,我发现TCP并不是针对这种问题而设计的,而是针对
client connects to server
|
V
client sends request to server
|
V
server sends request answer
|
V
server closes connection.
这是真的吗?
但我不能相信,对于发送的每个数据,都必须连接一个新的套接字,就像这样。这个解决方案也很慢。
但如果是这样的话,我可以选择什么
为了说明更大的情况:
我有一些其他的代码,这是给我的状态数据(文本)在500Hz。在Python中,我正在处理这些数据,并将处理后的数据发送到带有以太网屏蔽的Arduino。这些数据是“实时”数据,所以我需要尽快将数据发送到arduino。这里的客户机是Python,服务器是带有以太网
模块的Arduino。连接和一切正常,只有连续发送数据是我的问题。问题很可能是代码假设一端发送1024字节意味着另一端将接收1024字节。TCP不保证这一点,但它可能会发生一段时间,或者永远不会发生,或者偶尔发生,或者99.9%的时间,或者在这些范围内的任何地方发生。让服务器在点击中断时打印消息,这可能是happening@barny我试着在休息前添加一个print语句,但在测试时它从未被击中。你还有其他想法吗?@barny你认为他的客户或服务器是这样认为的吗?或者两者都有?我看不出他的代码在哪里假设了这一点,或者这在哪里是一个问题。你真的在使用端口21吗?大多数平台不允许您在没有特殊权限的情况下监听端口21。启动客户端时,是否从服务器获得“连接方式”输出?