C# TCP通信接收消息与发送内容不匹配,如何实现正常匹配?
问题根因
- 客户端原有逻辑逐字节将单个字节转换为单字符字符串,
msg变量长度始终为1,永远不可能匹配长度为4的"poop"字符串 - 缺少将单次读取到的所有字节拼接为完整消息再校验的逻辑
修复后的客户端代码
try { TcpClient tcpclnt = new TcpClient(); Console.WriteLine("Connecting....."); tcpclnt.Connect("127.0.0.1",8001); Console.WriteLine("Connected"); Stream stm = tcpclnt.GetStream(); ASCIIEncoding asen= new ASCIIEncoding(); // 用于累计接收内容,处理TCP粘包场景 StringBuilder receiveBuffer = new StringBuilder(); while(true) { byte[] bb=new byte[100]; int k=stm.Read(bb,0,100); // 将本次读取到的所有字节转为字符串追加到缓存 receiveBuffer.Append(asen.GetString(bb, 0, k)); string currentContent = receiveBuffer.ToString(); // 判断是否包含目标关键词 if(currentContent.Contains("poop")) { Console.WriteLine("Poop executed."); // 处理完后清空缓存,或者根据实际业务裁剪已处理的内容 receiveBuffer.Clear(); } } } catch (Exception e) { Console.WriteLine("Error..... " + e.StackTrace); }
补充说明
TCP是流协议,不存在天然的消息边界,单次Read操作读取到的内容不一定刚好是服务端单次发送的完整内容,可能出现半条消息或者多条消息粘在一起的情况。生产环境使用时建议约定消息规则:
- 方案1:每条消息末尾加特殊分隔符(比如
\n),接收端按分隔符拆分消息 - 方案2:发送消息时先发送4字节的整数标识消息长度,接收端先读长度再读取对应长度的内容作为完整消息
内容的提问来源于stack exchange,提问作者rosenishere
相关产品推荐
相关产品推荐

