如何在用Python编写的Minecraft Classic服务器中发送数据包
我正在用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模块页面也有一些非常有用的信息。