尝试与Python中的Minecraft服务器交互时连接重置

时间:2012-03-02 21:55:23

标签: python sockets minecraft packets

尝试将数据包发送到Minecraft 1.1 SMP服务器时遇到了一些问题。

我有以下文件(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 个答案:

答案 0 :(得分:1)

协议文档说“字符串”是一个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是您应发送的内容。