2016-12-30 10 views
1

このプロトコルに関する知識を向上させるために、TCPサーバーをプログラミングしています。最近、私のサーバーと複数のクライアントとの接続を確立するために、コミュニティメンバー(RenéVogt mr)が手伝ってくれました。TCP C#特定クライアントへのパケット

すべて正常に動作し、接続されたすべてのクライアントに回答(単純なアライブパケット)が送信されています。しかし今、パケットを送信するための接続を指定したいと思います。

サーバーは専用ホストで実行されています。私のパーソナルコンピュータは、クライアント1としてサーバーに接続し、アライブパケット( "AA")を送信し、サーバー応答を受信します。次に、別のクライアント(Client2、client3 ...およびon)がサーバーに接続します。 aliveが受信され、サーバーはこのクライアントに応答します。しかし、さらに、 "Client2 is connected"(または何か他のもの)のようなパケットをClient1に送信したいと思います。

私のコードは以下の通りです:

using System; 
using System.Threading; 
using System.Net.Sockets; 
using MySql.Data.MySqlClient; 
using System.Net; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      TcpListener serverSocket = new TcpListener(50000); 
      TcpClient clientSocket = default(TcpClient); 
      int counter = 0; 

      serverSocket.Start(); 
      Console.WriteLine(" >> " + "Server Started"); 

     counter = 0; 
      while (true) 
      { 
       counter += 1; 
       clientSocket = serverSocket.AcceptTcpClient(); 
       Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!"); 
       handleClinet client = new handleClinet(); 
       client.startClient(clientSocket, Convert.ToString(counter)); 
      } 

      clientSocket.Close(); 
      serverSocket.Stop(); 
      Console.WriteLine(" >> " + "exit"); 
      Console.ReadLine(); 
     } 
    } 

    //Class to handle each client request separatly 
    public class handleClinet 
    { 
     TcpClient clientSocket; 

     string clNo; 
     public void startClient(TcpClient inClientSocket, string clineNo) 
     { 
       this.clientSocket = inClientSocket; 
       this.clNo = clineNo; 
       Thread ctThread = new Thread(doChat); 
       ctThread.Start(); 

     } 
     private void doChat() 
     { 
      bool LoopReceive = true; 
      bool LoopSend = false; 
      int requestCount = 0; 
      byte[] bytesFrom = new byte[256]; 
      string dataFromClient = null; 
      Byte[] sendBytes = null; 
      string serverResponse = null; 
      string rCount = null; 
      requestCount = 0; 
      string Packettosend = ""; 

      while ((true)) 
      { 
       try 
       { 
        requestCount = requestCount + 1; 
        NetworkStream networkStream = clientSocket.GetStream(); 
        networkStream.Flush(); 
        networkStream.Read(bytesFrom, 0, bytesFrom.Length); 
        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        IPEndPoint remoteIpEndPoint = clientSocket.Client.RemoteEndPoint as IPEndPoint; 

        Console.WriteLine(" >> PACKET: " + dataFromClient); 



        if (dataFromClient.StartsWith("AA") 
        { 
         Packettosend = "ALIVE"; 
         Console.WriteLine("::ALIVE PACKET"); 
        } 


        //PACKETS TO SEND 
        if (Packettosend == "ALIVE") 
        { 
         Byte[] sendBytes1 = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; 
         networkStream.Write(sendBytes1, 0, sendBytes1.Length); 
        } 

       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(" >> " + ex.ToString()); 
       } 
      } 
     } 
    } 
} 

私はいくつかの答えを探し、彼らは動作しませんでした。パケットを送信している現在のクライアント以外のネットワークストリームを指すことは可能ですか?

ありがとうございます!

+0

番上のIDを検索します同じ接続。あなたのコードはネットワークのデータ層でデータを送信しています。 「Client2にメッセージを送信する」、「現在の接続を一覧表示する」、「Clinet2が接続されています」などのコマンドを処理するアプリケーション層を作成できます。その後、サーバーはコマンドを処理して応答を返します。 – jdweng

+0

しかし、どのように?私は初心者ですし、可能であれば、簡単な例が素晴らしいでしょう。 –

+0

コードは単純ではありません。学習の最善の方法は、本を読んで、「ネットワーク通信」と「7つのネットワーク層」の基本的な原理を理解することです。私がオンラインで投稿したコードのほとんどは、基本的なコミュニケーション理論を理解しておらず、コードを適切な層に適切に分けていません。私は電気工学のBSEE、コンピュータサイエンスのMSCS、博士号取得のための24単位、40年間の就職経験があります。私は本を​​書いてコースを教えることができた。しかし、簡単な例を挙げてはいけません。 – jdweng

答えて

1

簡単なコードは、IDや辞書とクライアントリストにストアクライアント、

Dictionary<TcpClient, int> clintlist= new Dictionary<TcpClient, int>(); 

であり、あなたが特定のクライアントを送信 にしたいときだけではないのclientlist

関連する問題