2016-09-22 111 views
0

我的socket服務器是相當簡單的,到目前爲止:如何處理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

一種方法是使用客戶端的IP地址。或者給每個客戶一個ID。 – jdweng

回答

1

您的接受多個連接的實現會創建匿名客戶端,這意味着超過1個連接後,您將無法識別正確的客戶端。如果識別是問題,那麼你可以做一件事情,讓客戶端向服務器發送一個標識符,如「Client1」。創建一個Dictionary並在你的方法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

嗨Rishabh庫馬爾!最近我遇到了類似的問題。我認爲像您的解決方案一樣,但是當服務器運行很長時間並且有很多客戶端時,會出現問題。事情是,應用程序開始創建大量的線程,並經過一段時間不接受更多的連接,直到我再次恢復。那麼,你能幫忙嗎?謝謝! –

+0

@RishabhKumar好吧,這是我告訴你的代碼,一段時間後我的記憶有些問題。謝謝你的幫助! https://pastebin.com/sx6iVnZD –

相關問題