2011-06-05 76 views
1

我正在開發可以從不同的客戶,這些命令,服務器會執行一些操作,並相應地發送回客戶端的響應的基礎上得到的一些命令的多客戶端TCP/IP服務器應用程序。如何處理多個TCP客戶機進行通信

我的問題是如何處理多個客戶端處理後的相關數據發送回該特定客戶端。如何將數據發送到服務器,以及如何在保護它,這樣的響應可以發回其相關TCPClient合格TCP client參考。

我使用TCPlistner創建TCPClient對象。那是oTCPClient = oTCPListener.AcceptTcpClient();。那麼如何爲每個TCPClient創建相關的NetworkStream進行通信。

回答

0

我會創造一個ConnectedClient類的構造函數有一個TCPClient,然後開始在該物體進入數據讀取TCPClientNetworkStream一個線程。 您也可以在ConnectedClient中有發送數據的方法。當你接收數據和要回復或轉發郵件,你可以在一個或多個存儲ConnectedClient對象的調用SendData

0

這裏是一個可以處理多個客戶端和多個客戶端響應服務器的例子

class MultyClientServer 
{ 
    private static int bufferSize = 2048; 
    private static byte[] buffer = new byte[bufferSize]; 
    private static List<Socket> clientSockets = new List<Socket>(); 
    private static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 


    static void Main(string[] args) 
    { 
     Console.Title = "Server"; 
     SetupServer(); 
     Console.ReadKey(); 
     CloseAllSockets(); 
    } 

    private static void SetupServer() 
    { 
     Console.WriteLine("Settings Up Server Plz Wait"); 
     serverSocket.Bind(new IPEndPoint(IPAddress.Any, YOUR PORT HERE)); 
     serverSocket.Listen(10); 
     serverSocket.BeginAccept(new AsyncCallback(CallBack), null); 
     Console.WriteLine("Server Made"); 
    } 

    private static void CallBack(IAsyncResult e) 
    { 
     try 
     { 
      Socket socket = serverSocket.EndAccept(e); 
      clientSockets.Add(socket); 
      Console.WriteLine("Client Connected"); 
      socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket); 
      serverSocket.BeginAccept(new AsyncCallback(CallBack), null); 
     } 
     catch (Exception ex) { Console.WriteLine(ex.Message); } 
    } 

    private static void ReceiveCallBack(IAsyncResult e) 
    { 
     try 
     { 
      Socket socket = (Socket)e.AsyncState; 
      int received; 
      try 
      { 
       received = socket.EndReceive(e); 
      } 
      catch (SocketException) 
      { 
       Console.WriteLine("Client forcefully disconnected"); 
       socket.Close(); 
       clientSockets.Remove(socket); 
       return; 
      } 
      byte[] dataBuf = new byte[received]; 
      Array.Copy(buffer, dataBuf, received); 

      string text = Encoding.ASCII.GetString(dataBuf); 
      Console.WriteLine("Client request: " + text); 

      string response = string.Empty; 


      try 
      { 
       if (command.ToLower() == "What Time is it") 
       { 
        response = DateTime.Now.ToString(); 
       } 
       else if (command.ToLower() == "Whats your name") 
       { 
        response = "Tyler Gregorcyk"; 
       } 
       else 
       { 
        response = "Invaled"; 
       } 
      } 
      catch (Exception et) { Console.WriteLine(et.Message); socket.Close(); clientSockets.Remove(socket); } 


      if(response == string.Empty) 
      { 
       response = "Invaled"; 
      } 

      if (response != string.Empty) 
      { 
       Console.WriteLine("Sent To Client: " + response); 
       byte[] data = Encoding.ASCII.GetBytes(response); 
       socket.Send(data); 
       serverSocket.BeginAccept(new AsyncCallback(CallBack), null); 
      } 

      conn.Close(); 
      socket.BeginReceive(buffer, 0, bufferSize, SocketFlags.None, ReceiveCallBack, socket); 
     } 
     catch (Exception) { } 
    } 

    private static void CloseAllSockets() 
    { 
     foreach (Socket socket in clientSockets) 
     { 
      socket.Shutdown(SocketShutdown.Both); 
      socket.Close(); 
     } 

     serverSocket.Close(); 
    } 
} 

BTW,這是一個教程YouTube上的一個編輯的版本:https://www.youtube.com/watch?v=xgLRe7QV6QI

相關問題