2011-12-24 15 views
1

私はシンプルなマルチスレッドのC#サーバーとクライアントを持っています。ただ1つのクライアントが接続されていれば、それと対話できますが、2つ以上が接続されている場合は、最後のNetworkStreamを使用しているようです。私ができるようにしたいのは、読み書きするストリームを指定する入力コマンドを与えることです。したがって、たとえば、最初のクライアントは「クライアント1」であり、2番目のクライアントは「クライアント2」です。私はちょうど私のコマンドのテキストボックスに "クライアント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

コードには多くの問題があります。あなたは 'using'ブロックを使用しておらず、例外を無視しています。 –

+0

おそらくそれは概念コードの証明です。あなたは彼が本で行っていない100の事を見つけることができます、それは彼の質問に答えることはありません。 –

答えて

1
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にして、上記のような現在アクティブなストリームを取得してください。

+0

OK、テキストボックスを追加して、NetworkStreamを使用します。networkStream2 = myClients [Convert.ToInt32(textBox3.Text)];私が辞書から欲しい流れを得る。新しいエントリが追加されるたびに、カウンタは1だけインクリメントされます。ただ1つのクライアントでは、ボックスに正しい番号がある限り、正常に動作します。しかし、いったん別のクライアントが接続すると、私は前のストリームを取得することはできません。あたかもそれが存在しないかのように行動します。どうしましたか? –

+0

-1は '使用中 'ブロックではありません。 –

+1

@ジョン・サンダース、答えを編集したばかりの方がいいかもしれません... – ivowiblo

関連する問題