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

循环读取NetworkStream时Read()返回重复字节的问题排查

解决NetworkStream循环读取时重复字节的问题

你的问题根源非常明确:每次调用stream.Read()后,你把整个byte[] data数组都转换成字符串了,但实际上Read()返回的bytesRead才是本次真正读取到的有效字节数。当最后一次读取的字节数小于数组长度(2048)时,数组里未被覆盖的位置还保留着上一次读取的残留数据,直接转换整个数组就会把这些旧数据也拼到output里,导致重复内容出现。

修正后的代码

TcpClient client = new TcpClient("server address", 23);
NetworkStream stream = client.GetStream();
byte[] data = new byte[2048]; // 以2KB块读取数据
int bytesRead;
string output = "";
do {
    bytesRead = stream.Read(data, 0, data.Length);
    // 关键:只转换本次实际读取到的bytesRead个字节,而非整个数组
    if (bytesRead > 0)
    {
        output += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
    }
} while (stream.DataAvailable);
return output;

额外注意事项

  • 务必判断bytesRead > 0,避免读取到0字节(比如流已关闭)时仍尝试转换空数据。
  • stream.DataAvailable仅能判断当前时刻流中是否有可用数据,若需要读取完整的服务端响应,建议使用更可靠的结束逻辑:比如约定特定的结束标记、预先读取响应长度,或者等待服务端主动关闭连接。
  • 如果传输内容包含非ASCII字符,建议替换为UTF8Encoding或对应业务场景的字符编码,避免出现乱码问题。

内容的提问来源于stack exchange,提问作者Masoud Keshavarz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:24:13