TCP Socket大数据循环收发异常:服务器重复读取前100字节
问题修复方案
核心问题定位
- 打印内容错误:服务器每次从数组起始索引0截取字符串,导致始终输出第一次读取的前N字节,而非当前新读取的数据。
- 进度更新错误:用预设的
curDataSize而非Read返回的实际读取字节数更新进度,会导致计算偏差,甚至死循环。 client.Available误用:强行限制读取大小为可用数据量,可能引发无数据时读取0字节,陷入循环无法退出。
修复后的服务器代码
byte[] message = new byte[messageSize]; int bytesRead = 0; int bytesLeft = messageSize; while (bytesLeft > 0) { int curDataSize = Math.Min(bufferSize, bytesLeft); int bytes = networkstream.Read(message, bytesRead, curDataSize); if (bytes == 0) { Debug.WriteLine("客户端连接已关闭"); break; } // 从当前读取的偏移位置截取内容 string messagestrr = Encoding.ASCII.GetString(message, bytesRead, bytes); Debug.WriteLine(messagestrr); // 用实际读取字节数更新进度 bytesRead += bytes; bytesLeft -= bytes; }
客户端代码简化(可选)
原客户端代码中offset变量未实际使用,可删除以简化逻辑:
int bytesSent = 0; int bytesLeft = message.Length; Debug.WriteLine(bytesLeft); byte[] encodedMessage = Encoding.ASCII.GetBytes(message); while (bytesLeft > 0) { int curDataSize = Math.Min(bufferSize, bytesLeft); networkstream.Write(encodedMessage, bytesSent, curDataSize); bytesSent += curDataSize; bytesLeft -= curDataSize; }
内容的提问来源于stack exchange,提问作者user12722902
相关产品推荐
相关产品推荐

