2011-12-04 62 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