You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:40:05