使用Python发送数据包时,Minecraft花了太长时间才能记录错误

时间:2012-10-15 21:31:56

标签: python sockets packet minecraft

好的,所以这基本上是我的代码:

class Server:
    def __init__(self, addr, port, mc):
        self.mc = mc
        data = {'user': mc.user, 'password': mc.pswd, 'version': '12'}
        data = urllib.urlencode(data)
        dta = urllib.urlopen("https://login.minecraft.net", data=data).read()
        dta = dta.split(":")
        self.sessionid = dta[3]
        self.socket = socket.socket()
        self.socket.connect((addr, port))
        data = {"user": mc.user, "host": addr, "port": port}
        enc = mc.user.encode('utf-16BE')
        structfmt = '!bh'
        bytes = struct.pack(structfmt, 2, len(enc))
        bytes = bytes + enc
        self.socket.send(self.get_login_packet(mc.user, mc.pswd, addr, port))
        self.random = False
        self.world = World()
    def test(self):
        self.socket.send(self.get_chat_packet(raw_input("Enter a message: ")))
        self.disconnect(raw_input("Enter the disconnect message: "))
    def keep_alive(self):
        if self.random:
            self.socket.send(struct.pack("!bi", 0, self.random))
    def get_login_packet(self, user, password, addr, port):
        data = {"user": mc.user, "host": addr, "port": port}
        enc = mc.user.encode('utf-16BE')
        structfmt = '!bh'
        bytes = struct.pack(structfmt, 2, len(enc))
        bytes = bytes + enc
        return bytes
    def get_chat_packet(self, message):
        if len(message) > 100:
            message = message[:100]
        return struct.pack("!bs", 3, message)
    def get_disconnect_packet(self, message):
        return struct.pack("!bs", 0xFF, message)
    def disconnect(self, message):
        self.socket.send(self.get_disconnect_packet(message))
        time.sleep(0.1)
        self.socket.close()

mc是python中的Minecraft实例,它基本上有4个属性,服务器(上面的类),user,pswd和world(现在是一个None类型)。

我不是想连接到Minecraft Classic,我正在尝试连接到付费版本。我在Windows XP上使用Python 2.5。我尝试在服务器上连接时给出的错误是

[INFO] Disconnecting /127.0.0.1:2292: Took too long to log in
[INFO] /127.0.0.1:2295 lost connection

Python上的错误是

    self.socket.send(self.get_chat_packet(raw_input("Enter a message: ")))
socket.error: (10053, 'Software caused connection abort')

请告诉我为什么会发生这种情况,最好是如何修复它。谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码非常糟糕,您将失败并使用这样的代码以有用且相对高效的方式实现所有数据包。看看,例如在mc3p如何实施协议。

现在您的问题是,您没有使用Handshake数据包发送协议版本(对于我的世界1.3来说是39),也没有发送hostport包。