2011-12-04 60 views
0

我創建了一個相互連接的客戶端和服務器。服務器能夠發送客戶端發送回客戶端的消息(處理後)...但是...如果有兩個客戶端連接,它只會將消息發送回發送消息的客戶端(大聲笑...)客戶端服務器通信故障C#

我該如何解決這個問題,以便它從任何客戶端發送消息到每個客戶端?

我用下面爲起點的例子,以獲得客戶端與服務器之間的連接:

client server communication

,當我嘗試以下方法我的程序死機:

SERVER:

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


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

      while (true) 
      { 
       bytesRead = 0; 

       try 
       { 
        //blocks until a client sends a message 
        bytesRead = clientStream.Read(message, 0, 4096); 
       } 
       catch (Exception ex) 
       { 
        Debug.Print(ex.Message); 
        break; 
       } 

       if (bytesRead == 0) 
       { 
        //the client has disconnected from the server 
        break; 
       } 
      } 


       //message has successfully been received 
       ASCIIEncoding encoder = new ASCIIEncoding(); 
       foreach (TcpClient c in ListOfClients) 
       { 
       System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 

       clientStream.Write(message, 0, message.Length); 


      } 

客戶:

private void boxChatArea_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     char[] contentForServer = null; 
     boxChatArea.MaxLength = 4000; 


     if (e.KeyChar == (char)Keys.Enter) 
     { 

      client = new TcpClient(); 

      IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), MainWindow.port); 
      client.Connect(serverEndPoint); 
      clientStream = client.GetStream(); 


      contentForServer = boxChatArea.Text.ToCharArray(); 
      byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(contentForServer); 
      clientStream.Write(bytesToSend, 0, bytesToSend.Length); 
      clientStream.Flush(); 
      boxChatArea.Text = null; 

      StartListening(); 

     } 
    } 


    public void StartListening() 
    { 

     HandleServerComm(client); 
    } 




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

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

     bytesRead = 0; 

      try 
      { 
       //FREEZES HERE - it doesn't freeze here without the loop that we added within the server... 
       bytesRead = clientStream.Read(message, 0, 4096); 
      } 
      catch (Exception ex) 
      { 
       Debug.Print(ex.Message); 
       //break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
      } 

      if (bytesRead != 0) 
      { 
       //message has successfully been received 
       ASCIIEncoding encoder = new ASCIIEncoding(); 
       string text = (encoder.GetString(message, 0, message.Length)); 

       if (enterCount >= 1) 
       { 
        displayBoxChatArea.AppendText(Environment.NewLine); 
        displayBoxChatArea.AppendText(text); 
        //displayBoxChatArea.Text = text; 
        Application.DoEvents(); 
       } 
       else 
       { 
        displayBoxChatArea.Text = text; 
        Application.DoEvents(); 
       } 
      } 
     enterCount++; 
     tcpClient.Close(); 

    } 
+0

可能重複(http://stackoverflow.com/questions/7065838/tcp-ip-client-server-not-working-over-internet) – Joe

回答

2

您應該列出連接的客戶端。
嘗試是這樣的:

List<TcpClient> clients = new List<TcpClient>(); 

private void ListenForClients() 
{ 
    this.tcpListener.Start(); 

    while (true) 
    { 
      //blocks until a client has connected to the server 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 
      if(!clients.Contains(clients)) 
       clients.Add(client); 
    } 
} 

用戶編輯進行評論
你做你的發送功能錯誤:您必須首先從一個客戶得到的只是信息,然後發送給大家。

clientStream = tcpClient.GetStream(); // Not in foreach loop !! 
// ... 
System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 
foreach(TcpClient client in clients) 
{ 
    // Send message to client 
    st = client.GetStream(); 
    st.Write(message, 0, message.Length); 
} 
的[TCP/IP客戶端服務器不能通過互聯網工作]
+0

我已經上傳了我的代碼,所以你可以看看我在做什麼。我(想)我實施了你的建議?然而,當我嘗試發送一條消息時,客戶端凍結了..出於某種原因.. – BigBug

+0

@BlueMonster:你可以在'HandleClientComm'中放置一個斷點,並明白哪一行是一切凍結的? – Marco

+0

好的,我已經完成了..我只是上傳我的代碼並發表評論,以便您可以看到它發生的位置... – BigBug