好的,所以这基本上是我的代码:
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')
请告诉我为什么会发生这种情况,最好是如何修复它。谢谢!
答案 0 :(得分:0)
您的代码非常糟糕,您将失败并使用这样的代码以有用且相对高效的方式实现所有数据包。看看,例如在mc3p如何实施协议。
现在您的问题是,您没有使用Handshake
数据包发送协议版本(对于我的世界1.3来说是39),也没有发送host
和port
包。