如何在Python中按私有通信协议通过TCP发送unsigned char
解决TCP客户端发送unsigned char二进制流的问题
你的问题出在两个核心点上:发送了文本字符串而非二进制字节流,以及错误使用了HTTP默认端口80,导致服务器把你的请求当成无效HTTP请求处理了。下面是修正后的实现方案:
问题拆解
- 你当前发送的是带空格的文本字符串(比如
"255 255 10..."),但服务器需要的是无分隔的unsigned char二进制流——每个数值对应一个8位字节,不需要空格。 - 端口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
相关产品推荐
相关产品推荐

