2011-12-24 1 views
1

저는 간단한 멀티 스레드 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

코드에 많은 문제가 있습니다. 당신은'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

좋아, 그래서 텍스트 상자를 추가하고 NetworkStream을 사용 networkStream2 = myClients [Convert.ToInt32 (textBox3.Text)]; 내가 사전에서 원하는 스트림을 얻으려면. 새로운 항목이 추가 될 때마다 counter가 하나씩 증가합니다. 상자 하나에 올바른 번호가있는 한 클라이언트 한 명만 있으면 제대로 작동합니다. 하지만 다른 클라이언트가 연결되면 이전 스트림을 가져올 수 없습니다. 마치 존재하지 않는 것처럼 행동합니다. 뭐가 문제 야? –

+0

-1 '사용'블록이 없습니다. –

+1

@ 존 손더스, 당신은 단지 ivowiblo는 말, 참으로 ... 대신 – ivowiblo

관련 문제