识别游戏中的线程(也与TCP相关)

时间:2013-02-09 01:39:58

标签: java multithreading tcp game-development

这是一个学校项目,请不要提供任何代码,我只是寻找指导我正确方向的提示。

编写并测试客户订阅的游戏服务器。订阅后,客户端会收到 目前正在进行的游戏列表(同一游戏,只是不同的“实例”)。然后,客户可以选择加入游戏或开始新游戏 一。在实际开始之前,游戏必须至少有两名玩家。系统必须支持多个客户端玩一个游戏,或多个客户端玩多个游戏。

该项目的目标是获得Java,TCP和线程方面的经验。

我目前的设计和实现有两个文件:server.java和client.java

  1. 服务器文件有3个类:服务器,大厅和游戏
  2. 客户端文件有1个类:Client。
  3. “游戏”的实施是微不足道的,我很好。

    目前,服务器类与客户端类建立TCP连接。 每次实例化客户端时,都会在服务器类中接受套接字,并继续执行该程序。

    继续,服务器类创建大厅类。

    大堂课程是我遇到麻烦的地方。默认情况下,我创建1个“游戏”对象,并传入clientSocket:

    game g = new game(clientSocket, playerID);                 
    g.start();
    

    游戏类扩展了线程,我认为这是正确的做法。每个“游戏”都是一个单独的线程,可以这么说,玩家A和B可以共享1个线程,玩家C和D可以用另一个线程开始新游戏。

    我是线程的新手,但这是我能想到的最佳实现。我排除了大厅的多个线程,因为这没有多大意义,客户的多线程也没有意义,所以我认为多线程游戏类是理想的。

    现在,当我创建2个客户端实例时,它们都加入了相同的“线程”(它们都在同一个游戏中并可以相互通信)。

    我该如何做到这一点,新玩家可以在大厅中键入“新”或其他任何内容并创建一个新的“游戏”,这是一个新的主题。

    我确定我误解了线程或其他什么部分,但我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我不会将游戏映射到线程。而是将客户端映射到线程。每个客户端都有自己的线程,该线程通过从该客户端接收命令来启动。当您需要创建新游戏时,只需在共享的游戏集合中创建一个新对象。在客户端实例中跟踪与之关联的游戏(如果有)。

如果您发现确实需要一个线程来管理游戏,那么您可以创建一个游戏。当客户端向特定游戏发送命令时,只需将该命令放在由管理该游戏的线程读取的命令队列上。游戏线程只需要知道它正在管理哪个游戏。该游戏结束后它可以自行终止。

答案 1 :(得分:0)

首先,我建议您阅读Java(UDP / TCP)中的多人游戏开发和网络。我不是游戏开发人员,但只是想在大学里学习Java网络课程并且有一个类似的项目(网络游戏)。

其次,处理多个线程与复杂性成正比。您希望最小化复杂性。我建议放弃“我必须找到一个使用线程的地方”的心态。 (不要在圆孔中施加方形钉;))

继续,遵循要求:

编写并测试客户订阅的游戏服务器。

  IIRC,这是相当简单的(你可能已经过了这一部分)。

订阅后,客户会收到当前正在播放的游戏列表(同一游戏,只是不同的'实例')

  

由于已经建立了服务器和客户端之间的TCP连接,因此这应该是相当简单的。

     

但是,目前还有几点需要了解。也许最重要的是,将有一个中央服务器,可以保存所有连接的客户端和现有游戏的信息。这意味着它必须是处理系统状态(例如跟踪当前存在的游戏室),客户端请求(创建/加入游戏室),以及用系统状态的相关信息更新客户端(例如创建/关闭游戏室)。

     

此时的另一个考虑因素是客户端系统功能的范围。典型的实现可能是胖服务器,瘦客户端架构。基本上,这意味着客户端不会对数据进行实际处理(来自用户输入),而是依赖于服务器。大多数情况下,客户端只等待来自用户的输入或来自服务器的响应。另一方面,服务器处理来自客户端的数据处理,更新系统状态(包括各个游戏状态),并通知相关客户系统/游戏状态的相关变化。

然后,客户可以选择加入游戏或开始新游戏

  

这里实际发生的是客户端向服务器发送“我选择加入游戏”或“我选择创建游戏”的数据。服务器对此采取行动并通知相关客户(我说关注而不是所有,因为有些客户可能正在玩,不需要知道新游戏是否已经产生)。

在实际开始之前,游戏必须至少有两名玩家。

  

-

系统必须支持所有玩一个游戏的多个客户,或多个客户玩多个游戏。

  

再次取决于客户端 - 服务器架构,服务器将执行所有处理(胖服务器,瘦客户端)或客户端(瘦服务器,胖 - 客户端)进行处理,而服务器主要用作其他客户端的中继点。然而,我对此没有明确的(甚至是自信的)建议,因为我对可能的实施及其后果的绝对数量感到不知所措。因此,我不能真正鼓励阅读有关网络和游戏开发的更多信息。单独来说,这两个主题非常庞大,合并时更是如此。

最后,关于线程的使用。 IIRC,为打开的套接字调度单独的线程对于防止应用程序被阻塞等待输入很有用。我不同意你在一个帖子中“托管”游戏的想法但是因为你在学校我只能欣赏你尝试过的东西。

这可能会对您有所帮助:Lesson: All About Sockets。您可能也对UDP感兴趣。