接受两个客户端套接字作为一对一游戏的服务器;教程中的错误
本文关键字:游戏 一对一 服务器 错误 教程 套接字 客户端 两个 | 更新日期: 2023-09-27 17:56:05
我想为我的战舰游戏添加网络一对一支持,并找到了有关服务器-客户端网络编程的本教程:
http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm
我使用的代码如下,或多或少只是从那里获取并进行了一些调整:
public class HandleClient
{
TcpClient clientSocket;
string clientNumber;
public void StartClient(TcpClient inClientSocket, string clientNumber)
{
this.clientSocket = inClientSocket;
this.clientNumber = clientNumber;
Thread clientThread = new Thread(DoChat);
clientThread.Start();
}
private void DoChat()
{
int requestCount = 0;
byte[] inBytes = new byte[10025];
string dataFromClient = null;
byte[] outBytes = null;
string rCount;
string serverResponse = null;
while (true)
{
try
{
requestCount++;
NetworkStream stream = clientSocket.GetStream();
stream.Read(inBytes, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = Encoding.ASCII.GetString(inBytes);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$$"));
Console.WriteLine(" >> From client " + clientNumber + dataFromClient);
rCount = Convert.ToString(requestCount);
serverResponse = "Server to client " + clientNumber + ": " + rCount;
outBytes = Encoding.ASCII.GetBytes(serverResponse);
stream.Write(outBytes, 0, outBytes.Length);
stream.Flush();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
和
class BattleshipServer
{
static void Main(string[] args)
{
TcpListener serverSocket = new TcpListener(IPAddress.Any, 8888);
TcpClient clientSocket = default(TcpClient);
int counter = 0;
serverSocket.Start();
while (true)
{
if (counter < 2)
{
counter++;
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Client " + counter + " connected.");
HandleClient client = new HandleClient();
client.StartClient(clientSocket, counter.ToString());
}
}
clientSocket.Close();
serverSocket.Stop();
Console.WriteLine(" >> " + "exit");
Console.ReadLine();
}
}
但是,我想知道上面的最后几行。Visual Studio抱怨这段代码无法访问,我明白为什么。这段代码存在背后有什么原因吗?另外,我想知道是什么让counter
一直上升?serverSocket.AcceptTcpClient()
是否让程序"等待"到另一个客户端连接?
谢谢!如果你知道任何其他好的消息来源来了解这一点,我会很高兴听到他们:)因为我仍然需要对上面的代码进行大量调整,以使我的游戏"等待"来自其他玩家的数据,限制玩家数量等等。
示例中的
拼写错误 ( handleClinet()
) 可能暗示代码从未被审查过; 你是对的,在这种情况下,代码不会离开while
块。
计数器似乎用作每个客户端的标识,如介绍中所述"可以同时处理多个客户端"。
在您的情况下,一对一的游戏,您可能想要一个serverSocket.AcceptTcpClient
并在交换了一些基本信息(即两端的玩家姓名)后开始游戏,并且您不需要在那里循环while
。