如何实现两个Java jar文件通信,完成远程Minecraft服务端向本地传事件通知
跨网通信实现方案
数据库方案可行性
数据库可以实现该需求,属于轮询拉取模式:
- 准备一台公网可访问的云数据库(推荐用轻量的Redis,也可以用MySQL),提前给远程服务端和本地程序开通读写权限
- 远程MC服务端触发
onDamage等事件时,往数据库的指定表/键写入事件内容、生成时间、未消费标记 - 本地运行的jar包按固定间隔(比如100ms~1s)轮询数据库,拉取未消费的事件后执行Arduino控制逻辑,执行完成后标记事件为已消费
- 优缺点:实现逻辑简单,不需要处理复杂的网络通信;但存在固定延迟,高频轮询会浪费数据库资源,还需要额外处理事件重复消费、过期清理问题
更合适的低延迟方案
以下方案均不需要本地设备暴露公网IP、不需要配置端口映射,实时性远高于数据库轮询方案:
1. WebSocket长连接方案
完全匹配你给出的示例代码逻辑,是最贴合需求的实现方式:
- 在远程部署的MC服务端jar包内集成WebSocket服务端,申请托管商允许的自定义端口对外提供WebSocket服务
- 本地运行的jar包集成WebSocket客户端,启动后主动向远程WebSocket服务端发起连接,连接成功后保持长链接
- 事件触发逻辑直接修改为:
onDamage() { // 直接通过已建立的WebSocket连接向本地设备推送消息 sendToWebSocketClient("damaged"); }
- 优势:实时性毫秒级,没有额外轮询开销,逻辑和你现有代码兼容性极高,主流MC托管商均支持自定义端口使用
2. MQTT消息队列方案
实现成本比WebSocket更低,不需要申请额外端口:
- 选用任意公网可用的MQTT broker,提前创建好专属的事件通知topic,给两端配置读写权限
- 远程MC服务端触发事件时,直接向指定topic发布对应消息
- 本地jar包启动后订阅同一个topic,收到消息后直接触发Arduino控制逻辑
- 优势:不需要自己维护长连接逻辑,协议轻量功耗低,稳定性高,仅需要托管商允许服务端对外发起公网请求即可,绝大多数MC托管商不会限制该类请求
内容的提问来源于stack exchange,提问作者Braden Baker
相关产品推荐
相关产品推荐

