проблема с несколькими клиентами и получение определенного потока - PullRequest
1 голос
/ 24 декабря 2011

У меня есть простой многопоточный сервер C # и клиент.Когда подключен только один клиент, я могу нормально с ним взаимодействовать, но когда два или более подключены, кажется, что я использую последний NetworkStream.То, что я хотел бы сделать, это дать команду ввода, которая определяет поток для чтения и записи.Так, например, первый клиент - «Клиент 1», а второй клиент - «Клиент 2».Я просто набрал бы «Клиент 2» в своем командном текстовом поле, и он получит поток для второго клиента.

Проблема в том, что я не знаю, как назначить текст клиентам.Вот соответствующий код с сервера:

    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) { }
    }

Итак, как я могу это сделать?

1 Ответ

1 голос
/ 24 декабря 2011
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 и отправьте свои данные. Создайте в своем словаре myClients поле класса, а затем просто получите текущий активный поток, как указано выше.

...