使用 Go 读取 Minecraft Motd 数据
下文中若无特殊说明,默认略去异常处理。
需要使用的库
import (
"encoding/hex"
"net"
"strconv"
"strings"
"time"
)
hex
用于加载 payloadnet
用于发送 payload 并读取结果strconv
和strings
用于处理结果‘time
用于设置 timeout
加载 payload
通过抓取 Minecraft 的数据包,其获取 Motd 的数据包为:
Hex
0100000000240D12D300FFFF00FEFEFEFEFDFDFDFD12345678
通过以下方法赋值给变量 payload :
payload, err := hex.DecodeString(0100000000240D12D300FFFF00FEFEFEFEFDFDFDFD12345678)
解析服务器地址并连接
假定存在字符串变量 server 和 port 分别存放了服务器的地址和端口,可通过以下方式建立连接:
addr, err := net.ResolveUDPAddr(udp, server+:+port) //解析服务器地址
conn, err := net.DialUDP(udp, nil, addr) //建立 UDP 连接
defer func(conn *net.UDPConn) {
_ = conn.Close() //在稍后关闭此 UDP 连接
}(conn)
此外,可通过以下方式获得服务器地址对应的 IP (如果服务器地址以域名形式提供):
ip := addr.IP.String()
发送 payload 并读取结果
_, err = conn.Write(payload) // 发送 payload
//读取结果
buf := make([]byte, 1024)
err = conn.SetReadDeadline(time.Now().Add(5 * time.Second)) //设置 5 秒的 timeout
_, err = conn.Read(buf) //读取结果
解析结果
//将二进制数据转换为字符串、分割并清理
motd := string(buf)
data := strings.Split(motd, ;)
data = data[:len(data)-1]
index | value | |
---|---|---|
0 | header | 数据头 |
1 | motd | Motd 文本 |
2 | protocol | 游戏协议版本 |
3 | version | 游戏版本 |
4 | player_online | 在线玩家人数 |
5 | player_max | 服务器允许的最大玩家数 |
6 | level | 一串和地图有关的数字 |
7 | level_name | 地图名称 |
8 | gamemode | 游戏模式 |
结语
完整代码可参考:https://github.com/gggxbbb/simpleWebUtils/blob/master/router/minecraft/minecraft.go 下 utilsMinecraftBedrock
函数
在线 demo:
GET https://t.gxb.icu/utils/minecraft/bedrock/<address>
GET https://t.gxb.icu/utils/minecraft/bedrock/<adddress>/<port>