2012-01-18 85 views
3

我正在設計用Python編寫的Minecraft Classic服務器,但我不知道如何正確發送數據包。我知道如何設置一個套接字,但我不知道的部分是如何以協議所需的格式發送它們。我理解協議,而不是如何在Python中實現它。我沒有真正的代碼發佈,只是心跳,這與我的問題無關。我瀏覽了幾臺服務器的源代碼,但我不明白它們。如何在用Python編寫的Minecraft Classic服務器中發送數據包

+1

使用'struct.pack()'。 [並注意到已經存在幾個python minecraft服務器。 (我希望的列表是一個python minecraft客戶端)。] – 2012-01-18 00:10:36

+0

@DanD。我意識到其他人的存在。我瀏覽了幾臺服務器的源代碼,但我不明白它們。你真的可以把關於'struct.pack()'的東西放到完整的答案中嗎? – elijaheac 2012-01-18 00:13:11

回答

4

正如丹D.提到你可以使用struct.pack格式化您的數據按協議的要求。 http://docs.python.org/library/struct.html的文檔有幾個例子。

然後你需要看看http://www.minecraftwiki.net/wiki/Classic_Server_Protocol#Packet_Protocol的數據包結構,它詳細描述了你的數據包需要的樣子。根據數據包描述,你需要一個struct.pack格式的字符串,前四個字節看起來像「Bbh」。

struct.pack("Bbh", 0, 1, 7) 

ID爲1和協議版本7.玩家識別數據包,您將與包64字節+ 1024字節的二進制剩下的部分來完成這一點,都與填充。

編輯:只記得Python可能不是本地的大端,所以你可能想把它扔到格式字符串中。

struct.pack("!Bbh", 0, 1, 7) 

你可以找到的包格式的例子,以及如何通過查看myne2服務器的源來處理它們

https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/constants.py

https://bitbucket.org/andrewgodwin/myne2/src/236deac8cd2f/myne/core/packeter.py

python module of the week page for struct也有一些非常有用的信息。

+0

感謝您的回答! – elijaheac 2012-01-18 01:55:28

相關問題