C# TCP通信接收异常数据问题:发送与接收数据不符
C# TCP通信发送指定字符串却收到异常数据的原因分析
咱们直接戳代码里的问题,这是TCP开发新手常踩的坑:
核心问题:服务端未按实际接收字节数解析数据
你服务端这段代码就是异常的根源:
int x = socket.ReceiveBufferSize; byte[] buffor = new byte[x]; int data = socket.Receive(buffor); string wiadomość = Encoding.ASCII.GetString(buffor);
ReceiveBufferSize是操作系统给Socket分配的缓冲区总容量,它通常远大于你实际发送的字符串字节数。当你直接把整个buffor转成字符串时,会把缓冲区里未被数据填充的空字节(\0)也一并转译,这就导致你看到的"异常数据"——比如正常字符串后面跟着一堆空白或乱码。
正确的做法是用Receive返回的data值(实际接收到的字节数)截取有效数据:
string wiadomość = Encoding.ASCII.GetString(buffor, 0, data);
额外注意:TCP的流式特性
TCP是流式协议,Receive方法不一定能一次性拿到所有发送的数据(比如数据量较大时,会被拆分成多个TCP段传输)。如果后续你要发送更长的内容,需要循环调用Receive,直到确认拿到完整消息——比如可以利用你代码里的$作为分隔符,或者约定消息开头带长度标识来判断接收完成。
小细节优化
客户端里的变量名hasło带特殊字符,虽然C#语法允许,但建议换成英文命名(比如password),避免编码或团队协作时的潜在问题。
修正后的服务端关键代码示例:
try { string msg = ""; Socket socket = Listerner.AcceptSocket(); byte[] buffor = new byte[1024]; // 用一个合理的固定大小,按需调整 int data = socket.Receive(buffor); string wiadomość = Encoding.ASCII.GetString(buffor, 0, data); // 这里就能拿到正确的字符串了 }
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

