Сброс соединения при попытке взаимодействия с сервером Minecraft в Python - PullRequest
0 голосов
/ 03 марта 2012

У меня небольшая проблема с попыткой отправки пакетов на SMP-сервер Minecraft 1.1.

У меня есть следующий файл (ServerConnect.py):

import socket
import struct

username = "JackBeePeeBot"
host = "smp.project-vanilla.com:2224"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("smp.project-vanilla.com", 2224))
packet = ""
packet += struct.pack(">B", 2)
packet += username
packet += ";"
packet += host
s.send(packet)
print(s.recv(1024))

Однако,когда я пытаюсь запустить это, я получаю следующее:

 Traceback (most recent call last):
  File "ServerConnect.py", line 13, in <module>
    print(s.recv(1024))
 socket.error: [Errno 104] Connection reset by peer

Для тех, кто не знает о спецификациях пакетов MineCraft, их можно найти здесь:

http://wiki.vg/Protocol

Я пытаюсь отправить рукопожатие.

Кто-нибудь знает, что происходит, почему и как это исправить?

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 03 марта 2012

В документации к протоколу говорится, что «строка» имеет длину 2 байта плюс строковые байты в UCS-2 (по два символа в каждом). Кроме того, все типы данных подписаны.

Возможно, вам следует попробовать что-то вроде этого:

import struct

data = {'user':u'JackBeePeeBot','host':u'smp.project-vanilla.com','port':2224}
stringfmt = u'%(user)s;%(host)s:%(port)d'
string = stringfmt % data
structfmt = '>bh'
# 1 byte header, 2 byte *character* (not byte) string length
# and ucs-2/utf-16 BE encoded string
packetbytes = struct.pack(structfmt, 2, len(string))+string.encode('utf-16BE')

packetbytes это то, что вы должны отправить.

...