【问题标题】:Java Client/Server turn based helpJava 客户端/服务器轮流帮助
【发布时间】:2011-04-13 13:56:52
【问题描述】:

我正在尝试制作客户端/服务器回合制游戏。我希望这是一个 2 人游戏。我将使用 Java 小程序作为客户端,以便人们可以通过浏览器在线玩游戏。

到目前为止,我所知道的是,我可以创建一个接受所有传入连接的服务器并创建一个线程来处理连接的客户端。我还可以编写将连接到服务器的客户端。我不知道如何让两个单独的客户端相互交互。

Applet 不能相互通信,因此必须通过服务器/线程进行通信(我假设)。

我对 Java 并不陌生,但我以前从未接触过任何网络。有人可以帮帮我吗?

【问题讨论】:

    标签: java client-server


    【解决方案1】:

    在我看来,处理此类回合制游戏的最佳策略是确定一些基本的架构方法。绘制组件和一些基本的游戏流程图。

    您应该将大部分游戏引擎逻辑放在服务器组件中。客户端应尽可能保持精简,主要关注

    1. 与游戏引擎的通信
    2. 接受用户输入
    3. 解读游戏引擎响应
    4. 绘制屏幕

    您的服务器/游戏引擎应该是相对无状态的,但要维护当前正在运行的游戏会话列表。有状态的 SOAP Web 服务甚至 HTTP Servlet 都是不错的选择,因为它们通过在请求中放置和读取会话 cookie 来为您维护会话。

    所有 Web 都基于请求响应而工作,因此它本质上是无状态的,但某些技术(如 Java servlet)将帮助您维护会话,因此您不必这样做。无需物理创建单独的线程,每个请求都会导致应用服务器产生一个新的执行线程,而会话本质上是易变的。

    在服务器端,我会在会话中保留特定活动游戏的所有数据。这样,您的游戏引擎将保持两个玩家之间的有序通信。

    1. 玩家 1 发送包含所有游戏状态更改信息的回合结束请求。
    2. 游戏引擎解释请求,对游戏状态进行必要的更改。
    3. 玩家 2 频繁发送请求以检查是否轮到玩家 2。
    4. 游戏引擎确认轮到玩家 2 的请求,并发送新的游戏状态作为响应。
    5. 玩家 2 收到响应,更新其游戏状态副本,并记录自上一回合以来的更改。
    6. 冲洗并重复。

    【讨论】:

    • 感谢您的帮助!您所说的大部分内容都是有道理的,我只是对 servlet 将在何处发挥作用感到有些困惑。
    • Servlet 本质上扮演着服务器的角色。他们被要求提供信息或信息已发布。这是必要的,因为小程序不能直接相互通信。想想在 Battle.NET 上玩星际争霸。单个会话/游戏中有许多玩家,而 Battle.NET 是服务器。每个玩家都不断地向 Battle.NET 发送有关他们正在做什么的信息,并且作为响应,Battle.NET 会发送有关其他玩家的更新信息。不要混淆服务器和主机。主机只是一个初始化会话参数的玩家。
    • 这是相当沉重的东西,所以不要气馁。在深入研究 servlet 及其功能之前,您需要对 HTTP 通信有一个坚实的掌握。网上有无数的教程可以教你这个。当您了解该范例时,您可以深入研究制作简单的 servlet,即请求网页,返回 HTML 响应。然后,您可以进入更高级的 servlet,例如将 Java 对象序列化为 HTTP 请求,以及从 servlet HTTP 响应中反序列化 Java 对象。
    • 好的,澄清这需要如何工作: 客户端(游戏小程序): 第 1 步:向服务器发送连接请求 第 2 步:服务器接受连接,然后从 servlet 请求游戏信息。第 3 步:根据来自 servlet 的信息,客户端执行任何必要的任务。第 4 步:客户端开始再次向 servlet 询问信息的循环。服务器: 第 1 步:启动并监听特定端口 第 2 步:接受连接,保存连接信息,然后继续监听端口。 Game Servlet:第 1 步:执行游戏小程序告诉它的任何事情并返回响应。
    • 在写完所有这些之后,我似乎比我想象的更失落。我认为值得注意的是,当用户通过登录屏幕登录到小程序时,他们将可以选择创建游戏或加入其他玩家创建的游戏。
    【解决方案2】:

    您只是将服务器用作中间人。

    1. 客户端 A 向服务器发送(写入)消息,其属性将客户端 B 表示为目标
    2. 服务器接收(读取)消息并将消息转发(写入)给客户端 B
    3. 客户端 B 接收(读取)消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2017-09-08
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多