Zh:RCON

From wiki.vg
Jump to navigation Jump to search

RCON是一种允许服务器管理员远程执行Minecraft命令的协议。它在1.9-pre4中引入,基本上是Minecraft上一个Source RCON协议的实现。

服务端配置

   enable-rcon=true
   rcon.password=<your password>
   rcon.port=<1-65535>
   broadcast-rcon-to-ops=false

默认端口为25575。

数据包格式

Minecraft协议相反,整型是小字节序的。

响应将发送回与你发送的相同请求ID。在认证失败时(如你的登录不正确,或者你未登录就尝试发送命令),请求ID则将设为-1

字段名称 字段类型 注释
Length int 包中remainder的长度
Request ID int 客户端生成的ID
Type int 3为登录、2为运行命令、0为多个包的响应
Payload byte[] ASCII文本
2-byte pad byte, byte 两个空字节

数据包

3:登录

传出负载:密码。

如果服务器返回具有相同请求ID的数据包,则认证成功(注意:数据包类型是2,而不是3)。如果你获得的请求ID为-1,则认证失败(密码错误)。

2:命令

传出负载应该是要运行的命令,如time set 0

0:命令响应

输入的负载是命令输出,尽管许多命令不返回内容,也无法检测未知命令。

命令输出可能会被拆分为多个数据包,每个包含4096个字节(最后一个数据包较少)。每个数据包都包含部分负载(以及两个字节的填充)。发送的最后一个数据包是输出末尾。

碎片

最大C->S数据包负载长度:1446 (总计:1460) - 已过时?

最大S->C数据包负载长度:4096 (总计:4110)

Minecraft服务端可以在多个数据包件分散响应。并没有简单的方法来知道最后一个响应数据包的接收时间。方法包括:

  1. 等待至我们接收到负载长度<4096的数据包(不是100%可靠!)
  2. 等待n
  3. 发送两个命令包; 第二个命令触发来自服务器的具有相同请求ID的响应,由此我们知道我们已经收到了对第一个命令的完整响应。
    • 第二个数据包应该使用不会产生碎片输出的命令
    • 另一种是让第二个C->S数据包使用无效的类型(例如100)。服务器将使用负载设置为“Unknown request 100”的“Command response”数据包进行响应。

示例实现