2013-05-03 73 views
1

所以我寫了一個簡單的客戶端 - 服務器應用程序。它應該發送一個數據包,然後等待接收數據包,然後發送一個數據包......問題是,它接收到第一個數據包,但是當我在第二次迭代中啓動TcpListener時,它給了我這個錯誤:TcpListener不會確認連接

No connection could be made because the target machine actively refused it 127.0.0.1:13

private void listenForConnections() 
    { 
     bool prejelPaket = false; 
     listener = new TcpListener(IPAddress, port); 
     listener.Start(); 

     while (!packetReceived) 
     { 
      try 
      { 
       client = listener.AcceptTcpClient(); 
       listener.Stop(); 

       networkStream = client.GetStream(); 
       byte[] message = new byte[1024]; 
       networkStream.Read(message, 0, message.Length); 
       networkStream.Close(); 

       string strMessage = Encoding.UTF8.GetString(message); 
       packetReceived= true; 
       MessageBox.Show("received message: " + strMessage); 

       client.Close(); 
      } 
      catch (Exception ee) 
      { 
       thListen.Join(); 
      } 
     } 
    } 

    private void sendPacket(object pClient) 
    { 
     string message = "test message; 

     try 
     { 
      client = (TcpClient)pClient; 
      client.Connect(IPAddress, port); 
      networkStream = client.GetStream(); 
      byte[] strMessage = Encoding.UTF8.GetBytes(message); 
      networkStream.Write(strMessage, 0, strMessage.Length);   
      networkStream.Close(); 
      client.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

回答

1

創建一次客戶端/網絡流。將它們存儲在一個屬性中,直到完成發送和接收。然後關閉並處置。不要停止/關閉每次迭代之間的連接。

+0

謝謝,這對我有很大幫助,現在效果很好。乾杯。 – Kajzer 2013-05-03 10:08:56

1

移動

listener.Stop(); 

在while循環的外部。

編輯:解釋爲什麼

爲什麼它的第一次,但第二次迭代失敗,是因爲第一個客戶是從client = listener.AcceptTcpClient()接受後的下一行代碼調用listener.Stop()其停止偵聽連接的原因。任何後續致電listener.AcceptTcpClient()的電話都會觸發InvalidOperationException。在while循環之外移動listener.Stop()只會在連接退出循環時停止監聽連接。

再看一遍packetReceived在第一次迭代中也被設置爲true,因此無論如何它將在第一個客戶端之後退出while循環,這是否是預期的行爲?

+0

+1正確的答案,但你應該解釋爲什麼 – jgauffin 2013-05-03 06:26:27

+0

我認爲你錯了,AcceptTcpClient()阻塞線程直到客戶端連接,所以當它連接時,它只會停止監聽器。 – Kajzer 2013-05-03 09:13:53

+0

這不是你所遇到的問題嗎?如果沒有,我誤解了你的問題。 – Hack 2013-05-03 10:51:02