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