Обработка пакетов, отправленных на сервер в Node.JS - PullRequest
0 голосов
/ 20 июня 2019

Я создаю и внедряю сервер Minecraft для Minecraft Beta 1.7.3 в Node.JS. Я получил базовую обработку пакетов, но мне действительно нужен хороший способ для чтения данных, передаваемых между клиентом и сервером. Я не очень много знаю о пакетах (и это, вероятно, не очень хорошая вещь), но мне просто нужен какой-то совет относительно того, как создать этот сервер.

Я просмотрел протокол для этой конкретной версии Minecraft и заметил, что у каждого пакета есть свой собственный идентификатор. Я создал некоторый код для определения идентификатора пакета и ответа на то, что отправляет сервер. Вот текущий код:

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 (рукопожатие) получен, он отправляет правильную вещь обратно. Я использую модуль для определения идентификатора пакета, но я уверен, что это неправильный способ сделать это.

Так как бы мне извлечь данные из пакета с Node.JS? Мне нужно было бы создать какую-то систему обработки пакетов и как-то рассылать пакеты. Я не совсем уверен, с чего начать, и чувствую, что моя реализация сейчас очень хакерская. Так что любая помощь или предложения будут с благодарностью!

...