循环读取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
相关产品推荐
相关产品推荐

