我正在使用C#编写一个客户端/服务器应用程序,目前一切都很顺利。现在,一切工作正常,而且非常健壮。我的问题是在发送数据包时遇到一些延迟。
在客户端,我正在执行以下操作:
NetworkStream ns = tcpClient.GetStream();
// Send packet
byte[] sizePacket = BitConverter.GetBytes(request.Length);
byte[] requestWithHeader = new byte[sizePacket.Length + request.Length];
sizePacket.CopyTo(requestWithHeader, 0);
request.CopyTo(requestWithHeader, sizePacket.Length);
ns.Write(requestWithHeader, 0, requestWithHeader.Length);
// Receive response
ns.Read(sizePacket, 0, sizePacket.Length);
int responseLength = BitConverter.ToInt32(sizePacket, 0);
byte[] response = new byte[responseLength];
int bytesReceived = 0;
while (bytesReceived < responseLength)
{
int bytesRead = ns.Read(response, bytesReceived, responseLength - bytesReceived);
bytesReceived += bytesRead;
}
(省略了一些异常捕获等内容) 服务器相反,即它在 NetworkStream.Read() 上阻塞,直到它有一个完整的请求,然后处理它并使用 Write() 发送响应。
Write()/Read() 的原始速度不是问题(即发送大数据包很快),但连续发送几个小数据包而不关闭连接可能会非常慢(延迟50-100毫秒)。奇怪的是,这些延迟在具有典型ping时间<1ms 的局域网连接上显示出来,但如果服务器在本地主机上运行,则不会发生这种情况,即使ping时间实际上是相同的(至少差异不应该达到100毫秒数量级)。如果我在每个数据包上重新打开连接,导致大量握手,则这对我来说是有意义的,但我并没有这样做。好像服务器进入等待状态会使它与客户端不同步,然后当它重新建立了基本上是失去的连接时,它就会有点蹒跚。
那么,我做错了吗?是否有一种方法可以保持TcpServer和TcpClient之间的连接同步,以便服务器总是准备接收数据? (反之亦然:有时从客户端处理请求需要几毫秒钟,然后客户端似乎在阻塞Read()之后需要一些时间才能准备好接收来自服务器的响应。)