【发布时间】:2011-05-25 16:01:23
【问题描述】:
我正在用 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 时间
那么,我做错了吗?有没有办法让 TcpServer 和 TcpClient 之间的连接保持同步,以便服务器始终准备好接收数据? (反之亦然:有时处理来自客户端的请求需要几毫秒,然后客户端似乎还没有准备好接收来自服务器的响应,直到它在 Read() 阻塞后有片刻时间醒来.)
【问题讨论】:
-
您不使用WCF的任何特殊原因?该框架包含您尝试做的所有事情,并且内置了更多内容。
-
只是出于好奇,您是否尝试过使用 StreamReader?
-
相反,IMO; WCF 非常臃肿,大多数人只使用其中的一小部分。原始套接字通常很好,而且通常效率更高。
-
我快速浏览了 WCF,虽然我可以看到它在互连的企业应用程序的巨大网格中如何有用,但我真的只是在能够在两个之间发送简单的字节数组之后网络上的计算机。 .NET 有很多很好的特性(序列化、DeflateStream、XML 等)可以扩展它,这对于我的目的来说已经绰绰有余了。 Anyeay 我现在修好了,见下文。
-
Jay:顺便说一句,我试过 StreamReader,没什么区别。但是谢谢。
标签: c# .net network-programming tcpclient tcpserver