このプロトコルに関する知識を向上させるために、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());
}
}
}
}
}
私はいくつかの答えを探し、彼らは動作しませんでした。パケットを送信している現在のクライアント以外のネットワークストリームを指すことは可能ですか?
ありがとうございます!
番上のIDを検索します同じ接続。あなたのコードはネットワークのデータ層でデータを送信しています。 「Client2にメッセージを送信する」、「現在の接続を一覧表示する」、「Clinet2が接続されています」などのコマンドを処理するアプリケーション層を作成できます。その後、サーバーはコマンドを処理して応答を返します。 – jdweng
しかし、どのように?私は初心者ですし、可能であれば、簡単な例が素晴らしいでしょう。 –
コードは単純ではありません。学習の最善の方法は、本を読んで、「ネットワーク通信」と「7つのネットワーク層」の基本的な原理を理解することです。私がオンラインで投稿したコードのほとんどは、基本的なコミュニケーション理論を理解しておらず、コードを適切な層に適切に分けていません。私は電気工学のBSEE、コンピュータサイエンスのMSCS、博士号取得のための24単位、40年間の就職経験があります。私は本を書いてコースを教えることができた。しかし、簡単な例を挙げてはいけません。 – jdweng