如何在用Python编写的Minecraft Classic服务器中发送数据包

3 投票
1 回答
1624 浏览
提问于 2025-04-17 10:29

我正在用Python设计一个Minecraft Classic的服务器,但我不知道怎么正确地发送数据包。我知道怎么设置一个套接字(socket),但是我不太清楚怎么按照协议需要的格式发送这些数据包。我理解这个协议的内容,只是不知道怎么在Python中实现它。我没有什么代码可以分享,只有一个心跳包的代码,但这和我的问题无关。我看过几个服务器的源代码,但我看不懂。

1 个回答

4

正如Dan D.提到的,你可以使用struct.pack来按照协议的要求格式化你的数据。你可以在这个文档中找到一些示例。

接下来,你需要查看这个链接中的数据包结构,它详细描述了你的数据包应该是什么样子的。根据数据包的描述,你需要一个类似于"Bbh"的struct.pack格式字符串来表示前4个字节。

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的每周Python模块页面也有一些非常有用的信息。

撰写回答