2016-09-22 11 views
0

マイソケットサーバは、これまでのところ非常に単純です:TCP C#ソケットサーバーで複数のアクティブな接続を処理する方法は?

 public static void listen() 
    { 
     TcpListener server = null; 
     IPAddress address = IPAddress.Parse("127.0.0.1"); 
     try 
     { 
      server = TcpListener.Create(5683); 
      server.Start(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.StackTrace); 
     } 


     while (true) 
     { 
      Thread.Sleep(10); 
      TcpClient client = server.AcceptTcpClient(); 
      Console.WriteLine("Accepted Client"); 

      Thread thread = new Thread (new ParameterizedThreadStart(SwordsServer.ClientHandler)); 
      thread.IsBackground = true; 
      thread.Start(client); 
     } 
    } 

    public static void ClientHandler(object c) 
    { 
     TcpClient client = (TcpClient)c; 
     NetworkStream netstream = client.GetStream(); 
     bool connected = true; 
     while (connected) 
     { 
      Thread.Sleep(10); 
      try 
      { 
       byte[] bytes = new byte[client.ReceiveBufferSize];     
       netstream.Read(bytes, 0, bytes.Length); 
       Console.WriteLine("got data"); 
       netstream.Write(bytes, 0, bytes.Length); 

      } 
      catch (Exception e) 
      { 
       connected = false; 
       Console.WriteLine(e); 
       Console.WriteLine(e.StackTrace); 
      } 
     } 
    } 

私の質問は、概念レベルで、どのようにそれぞれの固有clientのタブを続けるだろうし、特定のクライアントに他のスレッドから更新を送信されますか?例えば

、私はそれを放送するのではなく、そのクライアントに手を差し伸べるんどのように特定のクライアントのためのデータを、持っている場合は?または、クライアントがもはや接続されていない場合、どのように伝えることができますか?

ありがとうございました!

+1

リストオブジェクトリストにクライアントを追加します。 – jdweng

+0

しかし、その後、どのように私はそのリスト内の特定れるtcpClientを参照していますか?どのように私はそれらを区別するでしょうか? – MrDysprosium

+0

1つの方法は、クライアントのIPアドレスを使用することです。または、各クライアントにIDを与えます。 – jdweng

答えて

1

複数の接続を受け入れるための実装では匿名のクライアントが作成されます。つまり、1つを超える接続の後で正しいクライアントを識別できないことを意味します。識別が問題の場合は、クライアントが "Client1"のような識別子をサーバーに送信するようにすることができます。辞書を作成し、あなたの方法ClientHandlerの()には、クライアントからの識別子を読み、辞書にれるtcpClientのオブジェクトを追加します。

ので、変更されたコードは、このようなものになるだろう:

Dictionary<string, TCPClient> dictionary = new Dictionary<string, TCPClient>(); 


public static void ClientHandler(object c) 
    { 
     TcpClient client = (TcpClient)c; 
     NetworkStream netstream = client.GetStream(); 
     bool connected = true; 
     while (connected) 
     { 
      Thread.Sleep(10); 
      try 
      { 
       byte[] bytes = new byte[client.ReceiveBufferSize]; 

       //read the identifier from client 
       netstream.Read(bytes, 0, bytes.Length); 

       String id = System.Text.Encoding.UTF8.GetString(bytes); 

       //add the entry in the dictionary 
       dictionary.Add(id, client); 
       Console.WriteLine("got data"); 
       netstream.Write(bytes, 0, bytes.Length); 

      } 
      catch (Exception e) 
      { 
       connected = false; 
       Console.WriteLine(e); 
       Console.WriteLine(e.StackTrace); 
      } 
     } 
    } 

ノートを実行してください:あなたのアプリケーションが動的に更新が送信されるべきクライアントに決定するのに十分なインテリジェントでなければなりません。

+0

うん、それは私が私のUDPプログラムでは、私は単に彼らのクライアントオブジェクト値の鍵としてのIP /ソケットタプルを使用しないものです。ありがとう! – MrDysprosium

+0

こんにちはリシャブクマール!最近私はそれに似た問題を抱えています。私はあなたのような一つの解決策ではと思ったが、私の問題は、サーバーが長時間実行されているときに表示されるとクライアントをたくさん持っています。物事は、多くのスレッドを作成するアプリケーションの開始と私は再びそれを復元するまで、時間が多くの接続を受け入れていないということです。だから、あなたはそれに手を差し伸べることができますか?ありがとう! –

+0

@RishabhKumarまあ、この私のコードは、私はある時間後にメモリにいくつかの問題があると言いました。助けてくれてありがとう! https://pastebin.com/sx6iVnZD –

関連する問題