首页 > 解决方案 > TcpClient - 并非所有数据都被客户端接收

问题描述

我有简单的 tcp 服务器代码,它从传入的客户端连接读取命令,然后发送响应并立即关闭:

在服务器端:

private void HandleRequest(IRequest request, NetworkStream stream)
{
    .. request handling
    using (var ms = new MemoryStream())
    {
        using (var bw = new BinaryWriter(ms))
        {
            envelope.SerializeWithLengthPrefix(bw);
            ms.Position = 0;
            var data = ms.ToArray();
            Logger.Log(data.Length.ToString());
            stream.Write(data, 0, data.Length);
            // Thread.Sleep here helps
        }

    }
}

和客户:

using (var stream = client.GetStream())
{
    var writer = new BinaryWriter(stream);

    me.SerializeWithLengthPrefix(writer);
    int length = 0;
    var data = new byte[4];
    var s = stream.Read(data, 0, 4);
    if (s == 4)
        length = BitConverter.ToInt32(data, 0);

    var buffer = new byte[length];

    var bytesReaded = 0;
    while (bytesReaded < length)
    {
        var newDataReaded = stream.Read(buffer, bytesReaded, length - bytesReaded);
        bytesReaded += newDataReaded;
        if (newDataReaded == 0)
            throw new UnexpectedEndOfDataException(length, bytesReaded);
    }
                
    var response = new MessageEnvelope(buffer);
    return response;
}

我的问题是,当发送更大的数据(即 200kb)时,并非所有数据都被客户端接收。当仍然没有收到少量字节(通常为 1 到 5)并因此引发异常时,stream.Read 返回 0。另外 - 如果我在发送数据后没有立即关闭服务器端的套接字,一切正常。但我不知道这里发生了什么。TCP协议不应该确保所有这些数据都将被发送吗?

标签: c#.netsocketstcp

解决方案


推荐阅读