c# - 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协议不应该确保所有这些数据都将被发送吗?
解决方案
推荐阅读
- python - Sklearn cosine_similarity在python中将一维数组转换为二维数组
- getresponse - 通过 API 获取对 Mailwizz 的响应
- javascript - 如何找到 postMessage 的来源?
- jython - 在 Jython 中,如何打印带有浮点数的句子,它有一个百分比符号,数字和符号之间没有空格?
- javascript - 遍历服务器端文件夹中的每个图像
- multithreading - 如何在处理许多文件时最大化吞吐量
- javascript - 使用 scaleBand() 在轴刻度中的文本值
- amazon-web-services - 由于微服务速度慢,API 网关连接断开
- python - 错误的光标移动win32api
- arrays - 在承诺中使用 Array.push 时,数组保持为空