2013-10-07 7 views
4

TCP 서버/클라이언트 응용 프로그램에서 작업하고 있습니다.여러 클라이언트가있는 TCP 서버

내 질문은 : 연결이 listenforClient 방법을 수락 할 때까지

내 서버 응용 프로그램이 새 스레드 차단을 시작

그러나 다수의 클라이언트가 내 서버에 연결되어있을 때 내가 연결을 관리 할 수있는 방법과 그들은 동시에 다른 것을 요구합니다. 클라이언트 1이 어떻게 정보를 필요로하는지, 그리고 클라이언트 2가 정보를 얻는 지 어떻게 관리 할 수 ​​있습니까?

다중 스레드이므로 다중 클라이언트가 연결할 수는 있지만 요청을 어떻게 처리 할 수 ​​있습니까? 나는 1 가지 방법으로 모든 것을 넣고 싶지 않습니다. 사전에

감사

private void serverstart() 
    { 
     this.tcplistener = new TcpListener(IPAddress.Any, 49151); 
     this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
     this.listenThread.Start(); 
    } 

    private void ListenForClients() 
    { 
     this.tcplistener.Start(); 

     while (true) 
     { 
      //blocks until a client has connected to the server 
      TcpClient client = this.tcplistener.AcceptTcpClient(); 


      // here was first an message that send hello client 
      // 
      /////////////////////////////////////////////////// 

      //create a thread to handle communication 
      //with connected client 
      Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 

      clientThread.Start(client); 
     } 
    } 

    private void HandleClientComm(object client) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream 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 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

      //message has successfully been received 
      ASCIIEncoding encoder = new ASCIIEncoding(); 

      bufferincmessage = encoder.GetString(message, 0, bytesRead); 


      if (System.Text.RegularExpressions.Regex.IsMatch(bufferincmessage, Properties.Settings.Default.REQLogin, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
      { 
       bufferincmessageresult = bufferincmessage.Split('^'); 
       nickname_Cl = bufferincmessageresult[1]; 
       password_Cl = bufferincmessageresult[2]; 
       getuserdata_db(); 
       login(); 

       byte[] buffer = encoder.GetBytes(inlogmessage); 

       clientStream.Write(buffer, 0, buffer.Length); 
       clientStream.Flush(); 
      } 


     } 
    } 
+0

@bios 아주 좋은 블로그이며 도움이됩니다. Thx –

답변

5

클라이언트가 다른 스레드에 파견 될 것이다, 그래서 그들은 교차하지 않습니다. 메시지가 처리 될 위치에 "DispatchMethod"와 같은 것을 추가하기 만하면됩니다.

using System.Text.RegularExpressions; 
... 

if (Regex.IsMatch(bufferincmessage, Properties.Settings.Default.REQLogin, RegexOptions.IgnoreCase)) 
{ 
    ... 
} 
else if (Regex.IsMatch(bufferincmessage, /*some of your command1*/, RegexOptions.IgnoreCase)) 
{ 
    ... 
} 
else if (Regex.IsMatch(bufferincmessage, /*some of your command1*/, RegexOptions.IgnoreCase)) 
{ 
    ... 
} 
+0

아아 이제 이해합니다! 그것은 의미가있다 thx –

+0

나는 당신의 대답을 위해 당신을 투표하고 싶다. 그러나 나는 유감스럽게 생각할 수 없다. –

+0

그것은 좋다. 도움이되기를 바랍니다. – zaynyatyi

관련 문제