Python TCP Socket发送整数,C#客户端接收数据异常问题
TCP Socket 整数传输不匹配问题的解决方案
你遇到的问题根源在于Python和C#的整数序列化方式完全不兼容:
- Python把整数转成字符串(比如
6570变成"6570"),再用UTF-8编码成字节数组发送,实际发送的是b'6','5','7','0'这四个字节。 - C#却直接把收到的字节当作32位整数的二进制原始字节来解析,这两种字节格式完全不对应,所以得到的结果完全随机。
下面是两种可行的解决方法:
方法一:二进制序列化(推荐,适合传输数值型数据)
这种方式直接发送整数的二进制表示,需要统一字节序(通常用网络字节序,即大端序)。
Python发送端修改:
使用struct模块将整数打包成4字节的大端序二进制:
import struct # ... 连接代码 ... # 发送图片大小(二进制大端序) imageSize = len(encodedImage) # 打包成大端序的32位无符号整数('!'表示网络字节序,'I'对应无符号32位,有符号则用'i') size_bytes = struct.pack('!I', imageSize) socket.send(size_bytes)
C#接收端修改:
接收4字节数据,手动转换为大端序的整数(避免系统字节序差异影响跨平台兼容性):
// ... 连接代码 ... // 接收整数(二进制大端序) byte[] buffer = new byte[4]; // 32位整数固定占4字节 int bytesReceived = stream.Read(buffer, 0, buffer.Length); if (bytesReceived != 4) { throw new Exception("未接收到完整的整数数据"); } // 大端字节序转本地整数 int imageSize = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
方法二:字符串序列化(适合简单场景)
如果坚持用字符串传输,需要C#接收完整的字符串后再转换为整数:
Python发送端(建议添加结束标记方便识别):
# ... 连接代码 ... imageSize = len(encodedImage) # 添加换行符作为字符串结束标记,确保C#能读取完整内容 socket.send((str(imageSize) + "\n").encode("utf-8"))
C#接收端修改:
使用StreamReader读取完整字符串行后解析:
// ... 连接代码 ... // 接收字符串并转换为整数 using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { string sizeStr = reader.ReadLine(); if (int.TryParse(sizeStr, out int imageSize)) { // 成功解析,使用imageSize } else { // 处理解析失败的情况 } }
内容的提问来源于stack exchange,提问作者Slash
相关产品推荐
相关产品推荐

