You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:27:03