2012-07-21 78 views
-3

我有這段代碼。我可以成功地從我的客戶端接收數據,但只有一次。在我收到數據一次後,如果客戶端試圖發送更多的服務器沒有收到它。誰能幫忙?C#套接字 - 如何保持套接字打開?

private void startListening() 
    { 
     TcpListener server = null; 


     try 
     { 

      server = new TcpListener(IPAddress.Parse("127.0.0.1"), 7079); 

      server.Start(); 

      Byte[] bytes = new Byte[256]; 
      String data = null; 

      //Enter listening loop 
      while (true) 
      { 

       addLog("Waiting for push."); 

       TcpClient client = server.AcceptTcpClient(); 
       addLog("Push request received, accepted."); 

       data = null; 

       NetworkStream stream = client.GetStream(); 

       int i; 

       //Loop to receive all data 
       while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
       { 
        //Translate data bytes to ASCII string 
        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 

        //Process data 
        data = data.ToUpper(); 

        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); 

        //send response 
        stream.Write(msg, 0, msg.Length); 
        addLog("Received: '" + data + "'"); 
       } 

       //End ALL Connections 
       client.Close(); 
       server.Stop(); 
      } 
     } 
     catch(SocketException e) 
     { 
      addLog("SocketException: " + e); 
     } 
     finally 
     { 
      //Stop listening for new clients 
      MessageBox.Show("Finished."); 
     } 
    } 
+4

保護您的產品!怎麼分享知識?怎麼樣拯救Karl-JohanSjögren時間他可能會浪費回答你的問題? – 2012-07-21 05:50:13

+2

a)通過點擊「編輯」鏈接,您的原始代碼仍然可見。 b)StackOverflow上所有用戶生成的內容均獲得Creative Commons許可。 c)在這些情況下,建議創建一個最小可重現的示例 - 即刪除與該問題無關的任何代碼部分,確保問題仍然存在,然後發佈該代碼。 – 2012-07-21 06:13:45

+1

對不起,你是對的。我重新添加了代碼:) – DannyF247 2012-07-21 07:30:05

回答

3

您正在循環結束時關閉服務器和客戶端(server.Stop();)。你的外層循環將繼續,並嘗試從你的服務器獲得一個新的TcpClient(這將意味着建立了一個新的連接),但由於你已經停止了服務器,所以永遠不會發生(或可能拋出異常)。

+0

啊謝謝,我不得不刪除'server.Stop()'以及修改客戶代碼中的一件事。謝謝你的提示! – DannyF247 2012-07-21 05:31:47