接受两个客户端套接字作为一对一游戏的服务器;教程中的错误

本文关键字:游戏 一对一 服务器 错误 教程 套接字 客户端 两个 | 更新日期: 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