ゲームのチャットサービスを作っていますが、
アカウント情報のクライアントであるTCPリスナー、ある種のログインサービスを使用しています。クライアントをサーバーに接続したままにして、彼がまだオンラインであるかどうかを確認し、新しいメッセージがある場合はメッセージを送信し続けることができるかどうか疑問に思っています。
ログインキューのソケットのリストを作成しようとしましたが、新しいソケットを受け入れるとすぐに、サーバーへの以前のソケットが切断されました。
byte[] usernameByte = new byte[100];
int usernameRecieved = s.Receive(usernameByte);
//guiController.setText(System.DateTime.Now + " Recieved Login...");
byte[] passByte = new byte[100];
int passRecieved = s.Receive(passByte);
//guiController.setText(System.DateTime.Now + " Recieved Password...");
string username = "";
string password = "";
for (int i = 0; i < usernameRecieved; i++)
username += (Convert.ToChar(usernameByte[i]));
for (int i = 0; i < passRecieved; i++)
password += (Convert.ToChar(passByte[i]));
if (DomainController.getInstance().checkAccount(username, password))
{
ASCIIEncoding asen = new ASCIIEncoding();
s.Send(asen.GetBytes("true"));
s.Send(asen.GetBytes("U are succesfully logged in, press enter to continue"));
guiController.setText(serverName,System.DateTime.Now+"");
guiController.setText(serverName, "Sent Acknowledgement - Logged in");
}
else
{
ASCIIEncoding asen = new ASCIIEncoding();
s.Send(asen.GetBytes("false"));
s.Send(asen.GetBytes("U are NOT logged in, press enter to continue"));
guiController.setText(serverName, System.DateTime.Now + "");
guiController.setText(serverName, "\nSent Acknowledgement - Not logged in");
}
これは、ユーザーから送信されたアカウント情報を確認するために現在使用しているコードです。これを送信した直後に、ユーザーは接続を切断し、次の接続に進みます。
別々のソケットのリストを1つ作成し、それらを1つずつ処理しようとしましたが、接続を試みたのは2つの異なるマシンであったとしても、前のソケットの接続が切断されたため失敗しました。
プログラムにすべての接続を維持させるために使用できるソリューション/ソケットを保存する方法を誰かが持っていますか?だから私はユーザー1からユーザー2にメッセージを送信し、彼らが接続したソケットを使用することができますか?または、接続するたびにIDを追加する必要がありますか?
編集
クライアントコード:(これは単なるテストクライアントです)
while (true)
{
TcpClient tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");
tcpclnt.Connect("xx.xxx.xxx.xx", 26862);
// use the ipaddress as in the server program
while(!(checkResponse(tcpclnt.GetStream())))
{
Thread.Sleep(1000);
}
Console.WriteLine("Connected");
Console.Write("Enter the string to be transmitted : ");
String str = Console.ReadLine();
if (str == "")
{
str = " ";
}
Stream stm = tcpclnt.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(str);
Console.WriteLine("Transmitting.....");
stm.Write(ba, 0, ba.Length);
Console.Write("Enter the string to be transmitted : ");
String str2 = Console.ReadLine();
if (str2 == "")
{
str2 = " ";
}
Stream stm2 = tcpclnt.GetStream();
ASCIIEncoding asen2 = new ASCIIEncoding();
byte[] ba2 = asen2.GetBytes(str2);
Console.WriteLine("Transmitting.....");
stm.Write(ba2, 0, ba2.Length);
if (str == "false")
{
blijvenWerken = false;
}
byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
byte[] bb2 = new byte[100];
int k2 = stm.Read(bb2, 0, 100);
Console.Write("\n");
for (int i = 0; i < k2; i++)
Console.Write(Convert.ToChar(bb2[i]));
Console.WriteLine("\n");
tcpclnt.Close();
Thread.Sleep(1000);
}
ソケットを取得するサーバー:このコードはloginserverにあります。これは、接続を維持するために毎回1つのソケットしか受け入れられないため、queueCountを最大1に設定します。ユーザーアカウントに追加するために受け入れたソケット。
while (loginServerOn)
{
if (queueCount < 1)
{
if (loginServer.getLoginListener().Pending())
{
loginQueue.Add(loginServer.getSocket());
ASCIIEncoding asen = new ASCIIEncoding();
Socket s = loginQueue.First();
try
{
s.Send(asen.GetBytes("true"));
queueCount++;
}
catch
{
loginQueue.Remove(s);
}
}
}
}
受け入れられたソケットを返す関数。
public Socket getSocket()
{
return myList.AcceptSocket();
}
編集:質問の本質
受け取ったsockedまたはclientをAccountオブジェクトに追加したいので、すべての接続にリンクされたアカウントがあります。特定のアカウントにメッセージを送信する場合は、そのアカウントにバインドされたsockedまたはclientにメッセージを送信する必要があります。 、私がこれを達成する方法を教えてくれますか?