【问题标题】:Communication Between Two Java Files两个 Java 文件之间的通信
【发布时间】:2021-11-24 16:10:52
【问题描述】:

我有一个 Minecraft 服务器,它被配置为根据游戏中发生的事件更改我的 LED 灯条的颜色,但是,该服务器仅在我的计算机上运行时才有效。这是因为它需要使用 Arduino 来控制 LED 灯带。

我想知道是否有任何方法可以通过两个不同的 jar 文件进行通信,这样当 Minecraft 中发生事件时,它只会通过一个完全不同的文件告诉我的计算机。

例如:我使用像 Server.pro 这样的 Minecraft 服务器托管程序。每当玩家受到伤害时,我都会检测到。当播放器损坏时,我希望能够从主机通知我的计算机。像这样:

onDamage() {
     Print_to_other_computer(“damaged”);
}

我怎么能做这样的事情?我的问题是我不知道从哪里开始在这两个文件之间进行通信。也许是数据库?

【问题讨论】:

    标签: java minecraft


    【解决方案1】:

    有很多选择:

    1. 在您计算机的“jar 文件”(网络服务)上创建一个 API,并从您的 Minecraft 应用程序中调用该 API。该接口可以是 REST、SOAP、RMI 或任何其他现代技术。 (REST 是最好的选择)
    2. 在两个应用程序之间启用队列。以 ActiveMQ 为例。然后你就有了一个发布者-消费者模式。
    3. 您还可以使用基于事件的框架,例如 Axon Framework
    4. 您还可以在应用程序之间使用数据库。
    5. ......

    在两个应用程序之间使用 REST 接口是最简单的,也可能是最好的选择。最好的方法是指定一个开放的 api 规范(YAML 文件),然后生成服务器端和客户端。

    https://www.baeldung.com/java-openapi-generator-server

    https://blog.mimacom.com/using-the-openapi-generator-for-spring-boot/

    【讨论】:

    • @BradenBaker 我正在提出类似的建议。本质上,您需要一个发布/订阅(或此处描述的发布者-消费者)。这将允许您的应用程序从服务器接收状态更新,而无需不断地请求它们(轮询)。
    【解决方案2】:

    这个问题真的很广泛。有了这个答案,我将尝试将重点放在概念和概述上。负债太难了,因为选择太多了。

    文件与进程

    文件由字节组成。它们可用于对许多不同类型的内容进行编码。字节可以编码文本、音乐、视频、逻辑……

    可以包含用编程语言编写的可执行逻辑的文本文件。在大多数情况下,您需要先编译这些文本文件,以创建一个“二进制”或“可执行文件”,然后由操作系统执行。

    程序或应用程序由二进制文件组成。 可以执行二进制文件。二进制/可执行文件的运行实例称为“进程”。

    执行后台任务的二进制文件通常称为“服务”。服务通常安排在操作系统启动/停止时运行。

    协议

    当一个进程启动时,它可以读写数据到终端。它使用 3 个不同的流来做到这一点。标准输入、标准输出、标准错误。这是应用程序与用户通信的最基本方式。它还可以用于与其他应用程序通信。

    以类似的方式,您也可以使用流通过其他渠道进行通信。

    当不同的应用程序相互通信时,它们需要通过交换消息以结构化的方式进行。该结构需要尊重所谓的“通信协议”。有时协议依赖于其他协议。

    在更高的层次上,应用程序相互通信,通常想要提供一组命令,或者想要共享一组功能。远程执行代码通常称为“RPC”(远程过程调用)。一组这些共享函数通常称为“API”。

    通常提供的功能可以分为 4 类:创建/读取/更新/删除操作,缩写为“CRUD”。

    网络通信

    当进程位于不同的计算机上时,它们需要通过内部(例如办公室网络)或公共网络(例如互联网)进行通信

    当今的大多数网络都使用以太网协议(即 RJ45 电缆或 wifi),最重要的是,它们使用 IP 地址来唯一标识每台计算机。通信通常使用 TCP 完成(这是一种协商,其中一端侦听预定端口上的传入连接,另一端连接到它。然后双方可以发送/接收消息)。这一起被称为“TCP/IP”。大多数现代通信协议都基于 TCP/IP(尽管还有其他流行的协议)。

    TCP/IP 描述了设备如何创建连接,以及它们如何相互发送字节,但并未规定这些字节的组织方式。内容本身也需要协议。从历史上看,有很多,有些是编码的,有些是基于文本的。

    网络浏览器使用 HTTP 协议进行通信。这本身就是两个应用程序之间通信的协议。即网络浏览器和网络服务器。但是,HTTP 协议也可以作为其他通信协议的基础,例如 REST。

    REST 是一种用于不同应用程序之间通信的 Web 服务协议。并且可能是当今最受欢迎的。

    实时通信

    在许多情况下,如何触发通信以及哪些事件导致通信开始很重要。

    例如在像 REST 这样的协议中,有一个客户端和一个服务器。服务器从不先联系客户端。发起通信的是客户端。

    一些协议在客户端和服务器之间保持活动连接,并允许双向推送数据。

    有时一条消息需要立即响应。相比之下,在其他情况下,请求存储在“队列”中并在稍后阶段进行处理。 (同步与异步通信)。

    有些人更喜欢通过充当缓冲区的第 3 方进行通信,即所谓的“消息总线”。 (请参阅:kafka、rabbitMQ、Java 的 JMS,...)。这些技术更适合异步通信,而对于同步通信不太实用。它们非常适合松耦合系统。

    结论

    • 文件不通信,进程或服务可以。

    • 协议的选择很困难,因为有很多选择。

    • 没有万能的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2018-06-05
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多