在Node.JS中处理发送到服务器的数据包

时间:2019-06-20 05:52:43

标签: node.js parsing networking minecraft packet

我正在为Node.JS中的Minecraft Beta 1.7.3创建和实现Minecraft服务器。我已经掌握了基本的数据包处理方法,但是我确实需要一种很好的方法来读取客户端和服务器之间发送的数据。我对数据包的了解不多(这可能不是一件好事),但是我只需要一些有关如何创建此服务器的建议。

我查看了that specific version of Minecraft的协议,发现每个数据包都有其自己的特定ID。我创建了一些代码来检测数据包ID并响应服务器发送的内容。这是当前代码:

const net = require('net')
const parser = require('binary-parser').Parser
const server = net.createServer()

server.on('connection', (socket) => {
    socket.on('data', (buffer) => {
        let table = new parser()
        .int8("id")

        // Parse packet and do the thing based on the packet
        let id = table.parse(Buffer.from(buffer, 'hex'))
        console.log(`Packet ID: ${id.id}`)

        switch (id.id) {
            case 1:
                var map = new parser()
                .int8('id')
                .int32('protocol')
                .string('username')
                .int32('unused1')
                .int32('unused2')
                .int8('unused3')
                .int8('unused4')
                .uint8('unused5')
                .uint8('unused6')

                console.log(Buffer.from(buffer, 'hex'))
                var data = map.parse(Buffer.from(buffer, 'hex'))
                console.log(data.id)
                console.log(data.protocol)
                console.log(data.username)
            case 2:
                socket.write(Buffer.from([0x02, 0, 1, 0, 0x2d]))
        }
    })

    socket.on('error', (error) => {
        console.error(error)
    })
})

server.listen("25565", "localhost")

我能够看到一个看起来只有原始数据的缓冲区,但是我不知道如何将其解析为可用数据: enter image description here

基本上,假设收到数据包2(握手)时,它将正确的东西发回。我正在使用一个模块来检测数据包ID,但是我确定这不是正确的方法。

那么我将如何使用Node.JS从数据包中提取数据?我将需要创建某种类型的数据包处理系统并以某种方式发送数据包。我不太确定从哪开始,我觉得我现在的实现很hacky。因此,任何帮助或建议将不胜感激!

0 个答案:

没有答案