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

TCP Socket大数据循环收发异常:服务器重复读取前100字节

问题修复方案

核心问题定位

  1. 打印内容错误:服务器每次从数组起始索引0截取字符串,导致始终输出第一次读取的前N字节,而非当前新读取的数据。
  2. 进度更新错误:用预设的curDataSize而非Read返回的实际读取字节数更新进度,会导致计算偏差,甚至死循环。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:30:47