使用Python TCP套接字发送整数并在C#中接收 - 接收数据错误
我刚接触TCP套接字,想用Python(服务器)通过TCP套接字发送一个编码图像的大小(一个整数)。然后用一个C#的Winforms应用程序(客户端)来接收这个整数,但接收到的整数看起来很随机。例如,如果编码图像的大小是6570
,那么C#应用接收到的却是808924470
。
这是Python代码(发送方):
## Connection code...
# Send image size
imageSize = len(encodedImage)
socket.send(str(imageSize).encode("utf-8"))
这是C#代码(接收方):
// Connection code...
// Receive int
byte[] buffer = new byte[1024];
int bytesReceived = stream.Read(buffer);
int imageSize = BitConverter.ToInt32(buffer, 0);
1 个回答
1
这段Python代码发送的是UTF字符串数据,也就是说,像6570
这样的值会被转换成字节(以十六进制表示)为36-35-37-30。你需要解码这些数据。
最有效的方法可以是这样的:
var bytes = new byte[] { 0x36, 0x35, 0x37, 0x30 };
if (System.Buffers.Text.Utf8Parser.TryParse(bytes, out int value, out int bytesUsed))
{
Console.WriteLine($"Read {value} from {bytesUsed} bytes");
}
(你也可以使用Encoding.UTF8
将字节解析成string
,然后用int.Parse
把这个string
处理成int
;Utf8Parser
的设计是为了跳过中间的string
)
不过,你还需要考虑“帧”的问题;TCP是一种流协议,而不是消息协议。仅仅调用Read
是不够的——这可能只是一条消息的一半(比如只有65
),也可能是一条完整的消息,或者是57条完整消息和第58条消息的一半。对于文本协议,涉及换行符的情况是很常见的。
为了完整理解(了解现有代码在做什么),BitConverter.ToInt32
是在进行CPU字节序的“转换”(重新解释字节)成原始整数;因为你的CPU很可能是小端字节序,所以得到的整数是0x30373536(记住UTF8字节是十六进制的36-35-37-30,而小端字节序会反转字节的顺序),也就是十进制的808924470。