Как отправлять пакеты на сервере Minecraft Classic, написанном на Python - PullRequest
3 голосов
/ 18 января 2012

Я проектирую сервер Minecraft Classic, написанный на Python, но я не знаю, как правильно отправлять пакеты. Я знаю, как настроить сокет, но я не знаю, как отправить их в формате, необходимом для протокола. Я понимаю протокол, но не как реализовать его в Python. У меня нет кода для публикации, только сердцебиение, и это не имеет отношения к моему вопросу. Я просмотрел источник нескольких серверов, но не понимаю их.

1 Ответ

4 голосов
/ 18 января 2012

Как упоминал Дэн Д., вы можете использовать struct.pack для форматирования ваших данных в соответствии с требованиями протокола. В документации по http://docs.python.org/library/struct.html есть несколько примеров.

Затем вам нужно взглянуть на структуру пакетов на http://www.minecraftwiki.net/wiki/Classic_Server_Protocol#Packet_Protocol, которая подробно описывает, как должны выглядеть ваши пакеты. В соответствии с описанием пакета вам понадобится строка формата struct.pack, похожая на «Bbh» для первых 4 байтов.

struct.pack("Bbh", 0, 1, 7)

Для пакета идентификации игрока с идентификатором 1 и версией протокола 7. Вы должны будете дополнить его оставшейся частью пакета 64-байтовой строкой + 1024-байтовой двоичной частью, оба с заполнением.

РЕДАКТИРОВАТЬ: Только что вспомнил, что Python может не быть прямым порядком байтов, так что вы можете также добавить это в строку формата.

struct.pack("!Bbh", 0, 1, 7)

Примеры форматов пакетов и способы их обработки можно найти в источнике сервера myne2

https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/constants.py

https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/packeter.py

Модуль python страницы недели для struct также содержит очень полезную информацию.

...