2011-12-17 151 views
0

好吧,所以我在這裏解決一個有關服務器和客戶端如何在機器上工作的技術問題。我知道所有的NET進程,但我缺少引用代碼的東西。我無法找到與此相關的事情。在Visual C#2008TCPListener/TCPClient服務器客戶端寫入/讀取數據

我的代碼,我使用普通的TcpClient /的TCPListener有2個不同的項目:

PROJECT1(客戶端)

Project2的(服務器)

我的問題是,也許如此簡單:

1->關於服務器如何接收數據,事件處理程序a可能嗎? 在我的第一臺服務器的代碼我用來做這個循環:

while (true) 
{ 

if (NetworkStream.DataAvailable) 
    { 
     //stuff 
    } 

Thread.Sleep(200); 
} 

我遇到這是一個垃圾的方式從服務器控件的輸入數據。但服務器始終準備好接收數據。

我的問題:有什麼像...? - >

AcceptTcpClient(); 

我想要一個等待事件發生的處理程序,在這種情況下,一個特定的套接字數據接收。

2->一般網絡I/O方法。

問題是(旁邊我是noob)是如何處理多個數據寫入。 如果我用字節數組發送大量數據,發送可能會中斷,如果我發送更多的數據。所有數據都已加入並在接收時發生錯誤。我想處理多個寫入發送和接收。

這可能嗎?

+0

** 1)**`NetworkStream.Read(buffer,...,...)`是一個阻塞調用。你不需要那個奇怪的while循環。 ** 2)**`如果我發送更多數據,發送可能會中斷'。不,你可以安全地使用`NetworkStream.Write(buffer,...,...)` – 2011-12-17 01:04:05

回答

1

關於服務器如何接收數據,事件處理程序是可能的?

如果要編寫面向回調的服務器代碼,您可能會發現MSDN的Asynchronous Server Socket Example正是您要查找的內容。

...如果我發送更多數據,發送可能會中斷。所有數據都已加入並在接收時發生錯誤。

這是TCP性質。標準化的互聯網協議分爲幾類:

   block oriented stream oriented 
reliable   SCTP    TCP 
unreliable   UDP    --- 

如果你真的想送塊中的數據,您可以使用SCTP,但要知道,許多防火牆DROP SCTP數據包,因爲他們不是「平常」。我不知道您是否可以在開放的Internet上可靠地路由SCTP數據包。

您可以使用自己的標頭將自己的內容封裝到數據塊中,也可以將其他「同步」機制添加到系統中。考慮一個HTTP服務器,它必須等待,直到它讀取entire request一樣:直到服務器看到CRLFCRLF序列

GET /index.html HTTP/1.1␍␊ 
Host: www.example.com␍␊ 
␍␊ 

,它必須保持在一個緩衝部分讀取數據。這些字節可能會以十幾個或更多的數據包一次一個地進入。或者,如果客戶端在單個數據流中發送多個請求,則十幾個請求可能會進入單個數據包。

你只需要處理這個問題。

相關問題