响应状态包

时间:2018-11-05 16:39:54

标签: node.js sockets packet

我已经开始使用NodeJS缓冲区并了解它们,我决定使用Minecraft多人数据包。

因此,每当客户端中的某人进入多人游戏列表/刷新多人游戏列表时,就会向每个服务器发送一个数据包,这就是该数据包的格式

(一般包装)

  • 数据包长度:VarInt(数据包ID +数据长度)
  • 数据包ID:VarInt
  • 数据

(握手包)

  • 数据包长度:VarInt
  • 数据包ID:VarInt
  • 版本协议:VarInt
  • 地址字符串长度:VarInt
  • 地址:字符串
  • 端口:无符号短输入
  • 下一个状态:VarInt(枚举:1->状态,2->登录)

因此,我能够解码握手包,但是在解码之后,我将发送具有以下格式的响应包:

(握手响应格式)

因此,我使用上述格式创建了一个缓冲区。只是为了测试缓冲区中的所有内容是否符合预期,我对Buffer进行了解码,以防万一那里有什么问题,但那里没有错。

最后,当我向套接字写入缓冲区时,客户端似乎没有任何反应。

在客户端上,这就是我得到的:'无法ping localhost:25565:断开连接'

    this.server.on('connection', (socket) => {
        socket.on('data', (buffer) => {
            try {
                const packet = new Packet(buffer);

                if(packet.packet_id == PacketTypes.ServerBound.Handshake) {
                    const handshake = new HandshakePacket(buffer);
                    this.emit('packetHandshake', handshake);
                    console.log(`${chalk.yellow('Packet ' + packet.arrival.getTime())} -> Handshake`);
                    const pingEvent = new PingEvent(socket, handshake);
                    this.emit('ping', pingEvent);
                    if(!pingEvent.isCanceled) {
                        const buf = new MotdPacket(pingEvent).build();
                        this.logger.log(`Sending MOTD ${pingEvent.motd} to ${pingEvent.ip}`)
                        socket.write(buf);
                        this.test(buf);
                    }

                }

            } catch(e) {
                this.emit('error', e);
            }
        })
    });

这里可能出了什么问题?我只是不确定

顺便说一下,这就是响应缓冲区:

d80100d5017b2276657273696f6e223a207b226e616d65223a2022312e31312e32222c2270726f746f636f6c223a203331367d2c22706c6179657273223a207b226d6178223a203130302c226f6e6c696e65223a20352c2273616d706c65223a205b7b226e616d65223a2022736f6d656f6e65222c226964223a202234353636653639662d633930372d343865652d386437312d643762613561613030643230227d5d7d2c226465736372697074696f6e223a207b2274657874223a202248656c6c6f20776f726c64227d2c2266617669636f6e223a2022227d

我还尝试了删除“收藏夹” JSON条目,或者只是将其保留为空,但没有任何改变

我刚刚开始使用缓冲区和套接字。

编辑

哦,我不是使用net.Socket,而是使用http模块和http.on('connection, ... => .on('data', socket => {})) 真是个愚蠢的错误。

1 个答案:

答案 0 :(得分:0)

噢,我没有使用net.Socket,而是使用了http模块,以及http.on('connection,... => .on('data',socket => {}))一个愚蠢的错误。