クライアントがサーバーとチャットし、送信されたメッセージを受信するマルチスレッドのサーバークライアントシステムがありますが、クライアントからサーバーへの通信方法のみです。私はそれをクライアント・ツー・クライアントにしたいと考えています。問題は、クライアントを区別する方法と、おそらく互いのネットワーク ストリームを互いに接続する方法がわからないことです。
私は2つのクライアントだけのためにそれを作りたくありませんが、6つのクライアントを接続できるように一般的な方法でそれを作り、2番目に接続されたクライアントが前に接続されたものを見つけるようにします。
接続が受け入れられた後にクライアントオブジェクトを格納する配列を考えTcpClient[]
ましたが、それらを区別して互いに接続する方法がわかりません。
サーバークラスのコードは次のとおりです。
class TheServer
{
private TcpListener tcpListener;
private Thread threadListener;
TheMessage msg;
public TcpClient[] clientList = new TcpClient[100];
private int n = 0;
public void StartServer()
{
try
{
this.tcpListener = new TcpListener(IPAddress.Any, 8000);
this.threadListener = new Thread(new ThreadStart(ListenForClients));
this.threadListener.Start();
Console.WriteLine("Local end point: " + tcpListener.LocalEndpoint);
}
catch (Exception e)
{
throw;
}
}
private void ListenForClients()
{
this.tcpListener.Start();
while(true)
{
// block until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();
if (n == 0)
{
clientList[0] = client;
}
else
{
n++;
clientList[n] = client;
}
// create thread to handle communication with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.Start(clientList[n]);
}
}
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream stm = tcpClient.GetStream();
msg = new TheMessage();
while (true)
{
Byte[] bSize = new Byte[sizeof(Int32)];
stm.Read(bSize, 0, bSize.Length);
Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];
stm.Read(bData, 0, bData.Length);
msg = XmlRefactorServer.ByteArrayToObject<TheMessage>(bData);
String str = msg.Message;
Console.WriteLine(str);
stm.Flush();
// send back to client
msg.Message = str;
Byte[] bDataBack = XmlRefactorServer.ObjectToByteArray<TheMessage>(msg);
// NetworkStream stm2 = ------> perhaps here should get the second client stream ?!
Byte[] bSizeBack = BitConverter.GetBytes(bDataBack.Length);
stm2.Write(bSizeBack, 0, bSizeBack.Length);
stm2.Write(bDataBack, 0, bDataBack.Length);
stm2.Flush();
}
tcpClient.Close();
}