3

我正在设计一个用 Python 编写的 Minecraft Classic 服务器,但我不知道如何正确发送数据包。我知道如何设置套接字,但我不知道的部分是如何以协议所需的格式发送它们。我了解协议,只是不了解如何在 Python 中实现它。我真的没有要发布的代码,只有心跳,这与我的问题无关。我查看了几台服务器的来源,但我不明白它们。

4

1 回答 1

4

正如 Dan D. 所提到的,您可以使用 struct.pack 根据协议的要求来格式化您的数据。http://docs.python.org/library/struct.html上的文档有一些示例。

然后您需要查看http://www.minecraftwiki.net/wiki/Classic_Server_Protocol#Packet_Protocol上的数据包结构,它详细描述了您的数据包需要的外观。根据数据包描述,您需要一个 struct.pack 格式字符串,前 4 个字节看起来像“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

struct 的 week page的python 模块也有一些非常有用的信息。

于 2012-01-18T01:20:28.247 回答