Разбор буферов TCP пакетов в Node.js - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь создать игровой сервер TCP (для старой версии Minecraft) и хочу использовать Node.js в качестве серверного программного обеспечения.Я создал базовый сервер сокетов, и мне интересно, каков будет лучший способ анализа буферов данных?

Вот мой код прямо сейчас:

const net = require('net')
const serialize = require('node-serialize');
const server = net.createServer();

server.on('connection', (socket) => {
    socket.on('data', (buffer) => {
        let packetID = buffer.readUInt8(0);
        console.log(`Packet ID: ${packetID}`)

        switch (packetID) {
            case 1: 
                // Login Request
                // Log some info about the request
                let protocol = buffer.readUIntBE(2, 3)
                let playername = buffer.slice(7, buffer.length).toString()
                console.log(`Player name: ${playername}`)
                console.log(`Client protocol version: ${protocol}`)
                console.log(buffer)

                // Send login confirmation packet
                var packetInfo = [0x01, 0]
                var entityID = intToByteArray(1298)
                var seed = intToByteArray(971768181197178410)
                var mode = [0]
                var dimension = [0]
                var difficulty = [1]
                var height = [128]
                var maxPlayers = [8]
                var buff = Buffer.from([].concat.apply([], [packetInfo, entityID, seed, mode, dimension, difficulty, height, maxPlayers]))
                console.log(`Bytes: ${buff.byteLength}`)
                //socket.write(buff)

                // Disconnect/Kick Packet
                var buffr = stringToByteArray("§eKicked from the server (cause world doesn't load yet)")
                var packetbugger = [0xFF, 0, buffr.length / 2, 0]
                var finalbuffr = Buffer.from([].concat.apply([], [packetbugger, buffr]))
                socket.write(finalbuffr)
            case 2: 
                // Handshake
                // Sends a "-"
                console.log(serialize.unserialize(buffer).Username);
                socket.write(Buffer.from([0x02, 0, 1, 0, 0x2d]))
        }
    })

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

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

Я думаю, чтовероятно, есть лучший способ для анализа пакетов, чем то, что я делаю.Каждый пакет, который Minecraft отправляет на сервер, имеет свой собственный идентификатор, как подробно описано на wiki.vg.Вот примерная структура пакета для пакета сервер-клиент: enter image description here

Как я могу получить читаемые данные из буфера пакетов в Node.js?Например, я хотел бы иметь возможность извлечь строку имени игрока из пакета.Однако самое важное для меня - это извлечение идентификатора пакета в шестнадцатеричной форме.Я пытался, но я не могу этого сделать.Буду очень признателен за любую помощь или предложения, как это сделать.

Кроме того, как я смогу создать свой собственный пакет в том же формате, что и на картинке выше?На все эти вопросы я пытаюсь найти хорошие ответы.

...