2013-02-19 33 views
0

這是從客戶端接收值的函數。但問題是我只收到一次。無論多少次發送一些數據,MainWindows上的標籤只會被更改一次。通過套接字接收/發送數據不完全工作,只接收一次值

我在這裏做錯了什麼?

private void HandleClientComm(object client) 
{ 
    tcpClient = (TcpClient)client; 
    NetworkStream clientStream = tcpClient.GetStream(); 

    byte[] message = new byte[4096]; 
    int bytesRead; 

    while (true) 
    { 
     bytesRead = 0; 

     try 
     { 
      bytesRead = clientStream.Read(message, 0, 4096); 
     } 
     catch 
     { 
      break; 
     } 

     if (bytesRead == 0) 
     { 
      break; 
     } 

     if (String.IsNullOrWhiteSpace(data)) 
     { 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      data = encoder.GetString(message, 0, bytesRead); 

      MainWindow.Change(data); 
      tcpClient.Close(); 
     } 

     tcpClient.Close(); 

    } 

在客戶端我有這下面的例子:

try 
{ 
    TcpClient tcpclnt = new TcpClient(); 
    Console.WriteLine("Connecting....."); 
    tcpclnt.Connect("127.0.0.1", 8001); 
    Console.WriteLine("Connected"); 
    while (true) 
    { 
     Console.Write("Enter the string to be transmitted : "); 
     String str = Console.ReadLine(); 
     Stream stm = tcpclnt.GetStream(); 
     ASCIIEncoding asen = new ASCIIEncoding(); 
     byte[] ba = asen.GetBytes(str); 
     Console.WriteLine("Transmitting....."); 
     stm.Write(ba, 0, ba.Length); 
     stm.Flush(); 
     Console.WriteLine("Sent....."); 
    } 

    tcpclnt.Close(); 
    Console.Read(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Error..... " + e.StackTrace); 
} 

公正的快速例子,所以當我輸入的字符串名稱,價值變動第一次,但是當我進入第二次或者如果我退出客戶端程序並重新輸入任何內容,則標籤內容的值等於第一次發送的值。

回答

0

它看起來像您所呼叫的第一次成功讀取後:

tcpClient.Close(); 

這將防止未來被成功讀取。

如果你想避免這些類型的套接字問題,你考慮過使用網絡庫嗎?我是圖書館networkComms.net的開發人員,你可以找到一個簡短的例子或我的意思是here

+0

它沒有工作,我現在檢查你的圖書館。謝謝。 – moenad 2013-02-19 19:11:08

+0

到您網站的鏈接實際上並不是問題的答案,而只是爲了宣傳您的圖書館而設計的。預計堆棧溢出的答案將直接與被問到的問題相關。 – 2013-02-19 21:10:56

+0

@AndrewBarber - 恕我直言,我的答案的第一部分直接回答了這個問題。第二部分讓OP知道我的經驗是更好的解決方案。如果我不包括第二部分,請告知。 – MarcF 2013-02-19 21:18:51

0

您必須使用異步服務器套接字......看到這個樣本從MSDN Link

+0

檢查出來,謝謝你的鏈接。 – moenad 2013-02-19 19:11:28

+0

請給出答案:) – Antonio 2013-02-19 21:23:57

+1

@Antonio請不要讓人投票或接受你的答案。 – 2013-02-20 08:48:58

0

如果使用tcpClient.Close()後clientStream.Read(),它會拋出一個異常,這將運行抓阻止並打破你的循環。 (你在地方致電tcpClient.Close()內的循環,使剛剛擺脫的只是一個無助。。這都是錯誤的。)

tcpClient.Close()不應該所謂除非你完全完成連接後(而且它應該只被調用一次。)

此外,

「您必須關閉的NetworkStream當您通過發送和接收數據。關閉的TcpClient不會釋放NetworkStream「。

因此,請確保關閉TcpClient和NetworkStream,但只有當您完成循環中的處理時纔會關閉。

相關問題