Zh:RCON
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服务端可以在多个数据包件分散响应。并没有简单的方法来知道最后一个响应数据包的接收时间。方法包括:
- 等待至我们接收到负载长度<4096的数据包(不是100%可靠!)
- 等待n秒
- 发送两个命令包; 第二个命令触发来自服务器的具有相同请求ID的响应,由此我们知道我们已经收到了对第一个命令的完整响应。
- 第二个数据包应该使用不会产生碎片输出的命令
- 另一种是让第二个C->S数据包使用无效的类型(例如100)。服务器将使用负载设置为“Unknown request 100”的“Command response”数据包进行响应。
示例实现
- https://godoc.org/github.com/Tnze/go-mc/net#RCONConn (Go,客户端和服务端)
- https://github.com/barneygale/MCRcon (Python,基础,同步)
- https://github.com/MrReacher/async-mcrcon (Python 3.5+,基础,异步)
- https://gist.github.com/1292348 (PHP,基础,同步)
- https://github.com/tehbeard/node-rcon (node.js,基础,异步)
- https://bitbucket.org/jyc/rcon.js (RingoJS,同步,BSD协议)
- https://bitbucket.org/jyc/rcon (PHP,同步,BSD协议)
- https://github.com/A2PLab/minelib (Scala,基础)
- https://github.com/tiiffi/mcrcon (C,同步,zlib/libpng协议)
- https://github.com/micvbang/pocketmine-rcon (Go,基础,同步)
- https://github.com/SommerEngineering/MinecraftServerRCONSharp (.NET/Mono,C#,线程安全)
- https://github.com/CatCoderr/JRcon (Java,异步,AGPL-3.0协议)
- https://github.com/coNQP/mcipc (Python 3.6)