C# 多个客户端出现问题并获取特定流

C# 多个客户端出现问题并获取特定流,c#,networkstream,clients,C#,Networkstream,Clients,我有一个简单的多线程C服务器和客户端。当只有一个客户端连接时,我可以很好地与之交互,但当两个或更多客户端连接时,我似乎使用的是最后一个NetworkStream。我希望能够给出一个输入命令,指定要读写的流。因此,例如,第一个客户端是客户端1,第二个客户端是客户端2。我只需在我的命令文本框中输入client2,它就会得到第二个客户端的流 问题是,我不知道如何将文本分配给客户端。以下是来自服务器的相关代码: private void ClientThread(Object client)

我有一个简单的多线程C服务器和客户端。当只有一个客户端连接时,我可以很好地与之交互,但当两个或更多客户端连接时,我似乎使用的是最后一个NetworkStream。我希望能够给出一个输入命令,指定要读写的流。因此,例如,第一个客户端是客户端1,第二个客户端是客户端2。我只需在我的命令文本框中输入client2,它就会得到第二个客户端的流

问题是,我不知道如何将文本分配给客户端。以下是来自服务器的相关代码:

    private void ClientThread(Object client)
    {
        NetworkStream networkStream = ((TcpClient)client).GetStream();
        Dictionary<int, NetworkStream> myClients = new Dictionary<int, NetworkStream>(); // This didn't work.
        myClients.Add(counter, ((TcpClient)client).GetStream()); // Wouldn't write.
counter = counter + 1;
        streamReader = new StreamReader(networkStream);
        streamWriter = new StreamWriter(networkStream);
        strInput = new StringBuilder();          
        while (true)
        {
            try
            {
                strInput.Append(streamReader.ReadLine());
                strInput.Append("\r\n");
            }
            catch (Exception error)
            {
                break;
            }
            Application.DoEvents();
            DisplayMessage(strInput.ToString());
            strInput.Remove(0, strInput.Length);
        }
    }

    private void textBox2_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {                 
                //ListView.SelectedListViewItemCollection stuff = listView1.SelectedItems;
                //ip is displayed in listView1, if I could also bind the stream for the ip 
                //to it and select it, that would be cool.
                {
                    strInput.Append(textBox2.Text.ToString());
                    streamWriter.WriteLine(strInput);
                    streamWriter.Flush();
                    strInput.Remove(0, strInput.Length);
                    if (textBox2.Text == "cls") textBox1.Text = "";
                    textBox2.Text = "";
                }
            }
        }
        catch (Exception error) { }
    }
那么,我该怎么做呢

NetworkStream networkStream = myClients[2];
using(streamWriter = new StreamWriter(networkStream))
{
    streamWriter.WriteLine("hello client 2"); // send something to Client 2
}

networkStream = myClients[4];
using(streamWriter = new StreamWriter(networkStream))
{
    streamWriter.WriteLine("hello client 4"); // send something to Client 4
}
显然,您正在将所有客户端流存储到一个字典中。只需将该流加载到StreamWriter并发送数据。 将dictionary设置为myClients类字段,然后像上面那样获取当前活动流

显然,您正在将所有客户端流存储到一个字典中。只需将该流加载到StreamWriter并发送数据。
将dictionary设置为myClients类字段,然后像上面那样获取当前活动流。

OK,所以我添加了一个文本框,并使用NetworkStream networkStream2=myClients[Convert.ToInt32textBox3.text];从字典里得到我想要的信息流。每次添加一个新条目时,计数器将递增一。只有一个客户机,只要我在盒子里有正确的号码,它就可以正常工作。但一旦另一个客户端连接,我就无法获得上一个流。它的行为就像它不再存在一样。“出什么事了?”约翰斯明白,事实上,伊沃维布洛是这么说的。这是一种支持社区的方式。我目前的方法似乎遇到了问题。我不想在每次发送消息后释放流,这就是using似乎正在做的事情。我希望能够在消息发送后保持流的畅通。随时在客户端之间切换。这就是为什么每次我按enter键时,它都会检查textBox3中的数字,并从字典条目中获取该流,该条目仅在连接一个客户端时有效。无论如何,谢谢。好的,所以我添加了一个文本框,并使用NetworkStream networkStream2=myClients[Convert.ToInt32textBox3.text];从字典里得到我想要的信息流。每次添加一个新条目时,计数器将递增一。只有一个客户机,只要我在盒子里有正确的号码,它就可以正常工作。但一旦另一个客户端连接,我就无法获得上一个流。它的行为就像它不再存在一样。“出什么事了?”约翰斯明白,事实上,伊沃维布洛是这么说的。这是一种支持社区的方式。我目前的方法似乎遇到了问题。我不想在每次发送消息后释放流,这就是using似乎正在做的事情。我希望能够在消息发送后保持流的畅通。随时在客户端之间切换。这就是为什么每次我按enter键时,它都会检查textBox3中的数字,并从字典条目中获取该流,该条目仅在连接一个客户端时有效。无论如何,谢谢。你的代码有很多问题。你没有使用块,你忽略了异常。也许这是一个概念验证代码。你可以找到100件他没有按照书做的事情,这并不能回答他的问题。你的代码有很多问题。你没有使用块,你忽略了异常。也许这是一个概念验证代码。你可以找到100件他没有做的事,这本书没有回答他的问题。