@description: 通过TCP请求获取Java服务器信息 @param {string} Host 服务器地址,nyan.xyz:19132 @return {MotdJavaInfo} @return {error}
(Host string)
| 54 | //@return {MotdJavaInfo} |
| 55 | //@return {error} |
| 56 | func MotdJava(Host string) (MotdJavaInfo, error) { |
| 57 | //原代码来自 https://github.com/Cryptkeeper/go-minecraftping |
| 58 | var MotdInfo MotdJavaInfo |
| 59 | |
| 60 | //Host为空直接退出 |
| 61 | if Host == "" { |
| 62 | MotdInfo.Status = "offline" |
| 63 | return MotdInfo, nil |
| 64 | } |
| 65 | |
| 66 | timeout := time.Second * 5 //设置五秒超时 |
| 67 | deadline := time.Now().Add(timeout) |
| 68 | |
| 69 | time1 := time.Now().UnixNano() / 1e6 //记录发送时间 |
| 70 | conn, err := net.DialTimeout("tcp", Host, timeout) |
| 71 | if err != nil { |
| 72 | MotdInfo.Status = "offline" |
| 73 | return MotdInfo, err |
| 74 | } |
| 75 | defer conn.Close() |
| 76 | |
| 77 | if err := conn.SetDeadline(deadline); err != nil { |
| 78 | MotdInfo.Status = "offline" |
| 79 | return MotdInfo, err |
| 80 | } |
| 81 | |
| 82 | // 构造并写入握手包,打开连接,然后写入请求包。 |
| 83 | // More information: https://wiki.vg/Server_List_Ping |
| 84 | var buf bytes.Buffer |
| 85 | buf.Write([]byte("\x00")) |
| 86 | //这个版本号似乎无所谓? |
| 87 | //575表示1.15.1 |
| 88 | putVarInt(&buf, int32(575)) |
| 89 | |
| 90 | //分割服务器地址 |
| 91 | HostAddress := strings.Split(Host, ":") |
| 92 | Address := HostAddress[0] |
| 93 | Port, _ := strconv.Atoi(HostAddress[1]) |
| 94 | |
| 95 | putVarInt(&buf, int32(len(Address))) |
| 96 | buf.WriteString(Address) |
| 97 | binary.Write(&buf, binary.BigEndian, uint16(Port)) |
| 98 | putVarInt(&buf, 1) |
| 99 | //将缓冲区的长度作为uvarint预加 |
| 100 | var out bytes.Buffer |
| 101 | putVarInt(&out, int32(buf.Len())) |
| 102 | out.Write(buf.Bytes()) |
| 103 | handshake := out.Bytes() |
| 104 | conn.Write(handshake) |
| 105 | |
| 106 | var requestPacket = []byte{1, 0} |
| 107 | conn.Write(requestPacket) |
| 108 | |
| 109 | reader := bufio.NewReader(conn) |
| 110 | time2 := time.Now().UnixNano() / 1e6 //记录接收时间 |
| 111 | |
| 112 | // 读取并计算传入数据包的长度 |
| 113 | _, err = binary.ReadUvarint(reader) |