2012-07-24 211 views
1

我一直在從事一個項目,我從客戶端發送字符串到C#服務器。 我的問題有以下幾種,如果你們中的一些有時間來回答:發送消息速度套接字

  • 我送我的字符串如下:

    clientStream.Write(buffer, 0, buffer.Length); 
    clientStream.Flush(); 
    

其中clientStream是的NetworkStream。但它成爲一個問題,如果函數是在一個while循環 如下:

while(true) 
{ 
     clientStream.Write(buffer, 0, buffer.Length); 
     clientStream.Flush(); 
} 

這些消息似乎有時會交織在一起,並在服務器部分損壞。但是,如果我在while循環中添加一個Thread.Sleep(可能有30個作爲in參數)調用,則不行。 我不知道爲什麼這些消息如果是TCP套接字連接就會交織在一起?函數如何調用:

clientStream.Write(buffer, 0, buffer.Length); 
clientStream.Flush(); 

工作嗎?

  • 您可以通過TCP套接字連接每秒發送多少條消息?速度取決於什麼? 謝謝你的時間!
+3

TCP是基於流的,而不是基於消息的。不要用消息來思考。兩次調用'Write'不一定會導致兩次調用服務器上的'Read'。數據可能會在任何時候分裂或合併。然而,它將始終是連續的。 – 2012-07-24 16:45:54

+0

由於TCP,消息非常非常不可靠。我的猜測是你只是在沒有睡眠的情況下以某種方式向插座寫垃圾。您的應用程序是否從多個線程寫入相同的套接字? (通常,當問題是「垃圾輸出」時,這是一個很好的猜測。) – millimoose 2012-07-24 16:47:35

+0

知道如何創建和初始化「緩衝區」以及如何重新組裝服務器上的消息也很有趣。 (以及如何確定消息何時開始和結束。) – millimoose 2012-07-24 17:02:47

回答

1

不要始終刷新客戶端流,只想在寫週期結束時刷新,否則讓.NET爲您處理它。每次發送內容時都會沖洗效率低下。

還要記住,TCP流可以以不同的順序到達,並在接收端重新組裝,以便使用TCP序列,這是透明地完成的,但如果您通過wireshark查看流,那麼您可能會看到。

從理論上說,您可以通過套接字發送儘可能多的數據,因爲您的帶寬支持。但是你永遠不應該回應Thread.Sleeps,因爲這會在某天爆炸。依賴於這樣的時間安排被認爲是「骯髒的黑客攻擊」,並會導致問題。

+0

應該指出的是,除非服務器由於某些原因而使用原始套接字而不是TCP,否則從應用程序的角度來看,重組將以透明且正確的方式完成。 – millimoose 2012-07-24 16:50:57

+0

@millimoose多數民衆贊成完全真實。我會試着澄清要反思的答案。 – 2012-07-24 16:59:51

+0

謝謝你的回答!他們真的很有幫助! – 2012-07-27 19:40:13

相關問題