2012-03-01 38 views
3

你好親切的StackOverflow。如何使用Python發送數據包到遠程的Minecraft Classic服務器?

我正在嘗試製作一種可以連接到Minecraft Classic服務器,發佈消息並可能構建的「bot」。

無論如何,我在理解如何在python中發送數據包以及如何正確編碼它們方面遇到了一些麻煩。

這裏有我需要發送的數據包,我想送的「球員標識」之一:http://www.minecraftwiki.net/wiki/Classic_server_protocol#Client_.E2.86.92_Server_packets 我知道我需要使用套接字是的,我需要使用struct.pack,但我究竟能發送?

發送登錄數據包的示例代碼將非常奇妙。

謝謝。

回答

4

我會得到球滾動:

import socket 
import struct 

username = "username_value" 
verification_key = "verification_key" 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # boilerplate 
s.connect(("example.com", 1234)) # adjust accordingly 

# now for the packet 
# note that the String type is specified as having a length of 64, we'll pad that 

packet = "" 

packet += struct.pack("B", 1) # packet type 
packet += struct.pack("B", 7) # protocol version 
packet += "%-64s" % username # magic! 
packet += "%-64s" % verification_key 
packet += struct.pack("B", 0) # that unused byte, assuming a NULL byte here 

# send what we've crafted 
s.send(packet) 

的「%-20s」如果你從來沒有用過的格式字符串可能會奇怪你。基本上..

print "%s" % 5 

..將打印出5 ..

print "%10s" % 5 

..將墊的輸出是在寬度恰好10個字符。但他們墊在右側,我們要的是填充在左側 - 因此- ..

print "%-10s" % s, "<this will be 9 spaces away from the '5'>" 

..玩它。

如果有什麼不清楚的地方,請告訴我。我喜歡你在做什麼,讓我想起我的一箇舊項目。除了我沒有像你那樣的整潔的協議規範,幸運的混蛋。 ;)

+2

非常感謝!這正是我想要的,不可能更有幫助。 – Jack 2012-03-01 18:40:39

+0

你好,你能幫我嗎?當我嘗試連接到MC Classic Server時,它會給我錯誤響應'不兼容的客戶端或網絡錯誤。我該怎麼辦? – JadedTuna 2013-08-20 10:10:56

相關問題