使用 Go 读取 Minecraft Motd 数据

使用 Go 读取 Minecraft Motd 数据

下文中若无特殊说明,默认略去异常处理。

需要使用的库

import (
    "encoding/hex"
    "net"
    "strconv"
    "strings"
    "time"
)
  • hex 用于加载 payload
  • net 用于发送 payload 并读取结果
  • strconvstrings 用于处理结果‘
  • 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]
indexvalue
0header数据头
1motdMotd 文本
2protocol游戏协议版本
3version游戏版本
4player_online在线玩家人数
5player_max服务器允许的最大玩家数
6level一串和地图有关的数字
7level_name地图名称
8gamemode游戏模式

结语

完整代码可参考:https://github.com/gggxbbb/simpleWebUtils/blob/master/router/minecraft/minecraft.goutilsMinecraftBedrock 函数

在线 demo:

GET https://t.gxb.icu/utils/minecraft/bedrock/<address>
GET https://t.gxb.icu/utils/minecraft/bedrock/<adddress>/<port>
上一篇
下一篇