无法用Python复刻Tera Term的数据刷新效果,求解决方案
问题:Python Socket发送超长消息无法触发预期NAck响应
系统通信规则
我有一套基于TCP/IP协议的通信系统,日常使用Python的socket模块与其交互:
- 合法输入会立即返回确认(Ack),后续再返回处理结果;
- 非法输入(格式错误、校验和错误等)会立即返回未确认(NAck)且不再处理;
- 系统以
\r\n识别输入结束。
Tera Term测试验证
使用Tera Term通过SSH连接系统IP(如192.168.0.68)和端口(如123456)测试时,所有场景均得到预期响应:
- 过短/过长消息:返回
NAck - input length short&NAck - input length big - 校验和错误消息:返回
NAck - checksum error - 关键词序列错误消息:返回
NAck - input wrong format - 非法输入:返回
NAck - input invalid - 输入未完成超时:返回
NAck - timeout on input
Python测试异常情况
但使用Python socket模块测试时,发送过长消息未得到预期的NAck - input length big,反而返回NAck - timeout on input。
已尝试的无效方法
1. 循环send+设置SO_SNDBUF缓冲区
尝试了循环发送数据、设置发送缓冲区大小,也用过sendAll(),均无效:
import socket def send_data(ip_address, data, timeout=5000): try: # Create a socket object sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) # Connect to the target IP address sock.connect((ip_address, 12800)) # Send the data # sock.sendall(data.encode()) sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536) total_sent = 0 while total_sent < len(data): sent = sock.send(data[total_sent:]) print(sent) total_sent += sent # print(str(sock.recv(2048))) # Close the connection sock.close() return True # Data sent successfully except socket.timeout: return False # Timeout error # Usage ip_address = "192.168.0.68" temp_str = "ThisisTheCoreInput" * 50 + '\r\n' data = temp_str.encode() result = send_data(ip_address, data) if result: print("Data sent successfully") else: print("Timeout error occurred")
2. 使用asyncio模块测试
改用asyncio模块测试,结果依然无效:
import asyncio async def send_data(): try: reader, writer = await asyncio.open_connection('192.168.0.68', 12800) data = "ThisisTheCoreInput" * 50 + '\r\n' # to generate a very big string writer.write(data.encode()) await writer.drain() data = await reader.read(4096) msg = data.decode() print(msg) writer.close() await writer.wait_closed() except ConnectionRefusedError: print("Connection refused. Make sure the server is running.") async def main(): await send_data() asyncio.run(main())
推测与求助
我推测问题在于Python无法像Tera Term那样快速刷新数据,导致系统触发超时NAck而非长度超限NAck,求可行的解决方法。
内容的提问来源于stack exchange,提问作者Rohit Athithya
相关产品推荐
相关产品推荐

