我正在设计一个用Python编写的Minecraft Classic服务器,但我不知道如何正确发送数据包。我知道如何设置套接字,但我不知道的部分是如何以协议所需的格式发送它们。我理解协议,而不是如何在Python中实现它。我真的没有代码发布,只有心跳,这与我的问题无关。我查看了几个服务器的来源,但我不理解它们。
答案 0 :(得分: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)
对于标识为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也有一些非常有用的信息。