我正在为游戏制作聊天服务,
我正在使用 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 个单独的套接字列表并一个一个地处理它们,但由于前一个套接字的连接断开,因此失败了,即使它是 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);
}
服务器获取套接字:这段代码在登录服务器上,因为我每次只能接受 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 或客户端添加到我的 Account 对象,因此每个连接都有一个与其链接的 Account,当我想向某个帐户发送消息时,它应该向绑定到该帐户的 socked 或客户端发送消息,你能帮助/告诉我如何实现这一目标吗?