2009-11-05 78 views
0

我想實現一個tcp客戶端偵聽函數。這意味着在與服務器建立連接之後,這個tcp客戶端就坐在那裏等待新的數據到達。 這是我的代碼,但運行時,它抱怨無法讀取網絡流中的任何內容。但服務器尚未開始發送數據。我猜是抱怨是因爲tcp客戶端的超時時間爲 。tcpclient偵聽實現

這是正確的做法嗎?

public void listen(dataHandler processDataFuc) 
    { 
     NetworkStream stream; 

     Byte[] data_buffer = new Byte[MAX_PACKET_SIZE]; 

     if(!this.Connected) 
     { 
      this.Connect(); 
     } 

     while (!this.terminate_listening) 
     { 
      stream = main_client.GetStream(); 

      while (stream.Read(data_buffer, 0, data_buffer.Length) > 0) 
      { 
       processDataFuc(data_buffer); 
      } 
     } 
    } 

感謝

回答

1

簡短的回答是肯定的,它會做你想做的,但它的效果並不理想。我首先建議將stream = main_client.GetStream();移出while循環,因爲你只是一遍又一遍地得到相同的流。另外,如果您長時間期待間歇性數據,則使用NetworkStream.Read並不是執行連續讀取的最佳方式,因爲它只爲該任務提供線程;最好使用BeginRead並傳入一個回調,該回調將立即返回,但稍後會在數據可用時(通過回調)提醒您。

0

您使用的是什麼版本的.Net?
如果您使用.Net 4.0或4.5,則可以使用ReadAsync()而不是Read()
考慮一下:直到服務器發送一些數據

public async void listen(dataHandler processDataFuc) 
{ 
    NetworkStream stream; 

    Byte[] data_buffer = new Byte[MAX_PACKET_SIZE]; 

    if(!this.Connected) 
     this.Connect(); 

    stream = main_client.GetStream(); 

    while (!this.terminate_listening) 
    {    
     await stream.ReadAsync(data_buffer, 0, data_buffer.Length) 
     processDataFuc(data_buffer); 
    } 
} 

以這樣的方式,ReadAsync()將在一個單獨的線程等待。然後你的代碼的其餘部分將執行。

相關問題