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

如何在Python中按私有通信协议通过TCP发送unsigned char

解决TCP客户端发送unsigned char二进制流的问题

你的问题出在两个核心点上:发送了文本字符串而非二进制字节流,以及错误使用了HTTP默认端口80,导致服务器把你的请求当成无效HTTP请求处理了。下面是修正后的实现方案:

问题拆解

  1. 你当前发送的是带空格的文本字符串(比如"255 255 10..."),但服务器需要的是无分隔的unsigned char二进制流——每个数值对应一个8位字节,不需要空格。
  2. 端口80是HTTP协议的默认端口,服务器会自动尝试用HTTP规则解析你的请求,自然会返回400错误。你需要使用私有协议指定的端口(比如自定义的1234、8080等,需要你确认实际端口)。

修正后的代码

import socket

# 目标服务器配置:替换成私有协议的实际端口
host = '192.166.166.166'
port = 1234  # 这里务必改成私有协议规定的端口,不要用80!

# 创建TCP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    # 连接服务器
    s.connect((host, port))
    
    # 定义要发送的unsigned char数值序列
    data_sequence = [255, 255, 10, 3, 1, 0, 0, 1, 23, 45, 67, 89]
    # 把整数列表转换成二进制字节流:每个0-255的整数对应一个unsigned char字节
    binary_data = bytes(data_sequence)
    
    # 发送二进制数据
    s.sendall(binary_data)
    print(f"已发送符合要求的二进制数据:{binary_data}")
    
    # 接收服务器响应(如果有)
    response = s.recv(1024)
    print('服务器响应:', repr(response))
finally:
    # 确保套接字始终关闭,避免资源泄漏
    s.close()

关键说明

  • 二进制转换:bytes(data_sequence)是核心——Python的bytes类型正好对应C语言中的unsigned char数组,每个0-255的整数会被直接编码为对应的8位无符号字节,完全符合服务器的要求。
  • 端口修正:必须替换成私有协议指定的端口,否则服务器会用错误的协议解析你的请求。
  • 健壮性处理:使用try...finally块确保无论连接是否成功,套接字都会被正确关闭,避免资源占用。

额外注意事项

  • 确认单帧数据长度:你提到单帧是10-64位,这对应1.25到8字节,但你的示例是12个字节(96位),可能是描述笔误?请确保发送的序列长度符合私有协议的要求。
  • 响应解析:如果服务器返回的也是二进制数据,不要直接当成字符串处理,要按协议定义的格式解析每个字节的数值。

内容的提问来源于stack exchange,提问作者user1509863

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:04:14