我正在用C#編寫客戶端/服務器應用程序,它很棒。目前,一切正常,而且都非常強大。我的問題是,在連接上發送數據包時遇到了一些延遲。使用TcpClient進行通信的更快捷方式?
在客戶端,我這樣做:
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(),直到它有一個整個IT塊請求,然後處理它並使用Write()發送響應。
Write()/ Read()的原始速度不是問題(即發送大數據包很快),但是一個接一個地發送幾個小數據包而不關閉連接可能非常慢(延遲50-100毫秒)。奇怪的是,這些延遲出現在局域網連接上,典型的ping時間爲012毫秒,但是它們在本地主機上運行時不會發生,即使ping時間實際上是相同的(至少差異不應該是大約100毫秒)。如果我重新打開每個數據包的連接,這會對我有意義,導致很多握手,但我不是。就好像進入等待狀態的服務器拋出它與客戶端不同步,然後它重新建立了本質上是丟失的連接的一個絆腳石。
那麼,我做錯了嗎?有沒有辦法讓TcpServer和TcpClient之間的連接保持同步,以便服務器隨時可以接收數據? (反之亦然:有時處理來自客戶端的請求需要幾ms,然後客戶端似乎沒有準備好接收來自服務器的響應,直到在Read()被阻塞之後有一段時間纔會喚醒爲止。 )
只是出於好奇你是否嘗試使用StreamReader? – 2011-05-25 16:13:09
您爲什麼不使用[WCF](http://msdn.microsoft.com/zh-cn/netframework/aa663324)的任何特定原因? 這個框架包含了所有你想要做的和更多內置的東西。 – Jay 2011-05-25 16:04:06
與此相反IMO; WCF非常臃腫,大多數人只使用它的一小部分。原始套接字通常很好,通常效率更高。 – 2011-05-25 17:48:50