【问题标题】:How to send packets in a Minecraft Classic server written in Python如何在用 Python 编写的 Minecraft Classic 服务器中发送数据包
【发布时间】:2012-01-20 05:27:35
【问题描述】:

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

【问题讨论】:

  • 使用struct.pack()。 [请注意,已经存在多个 python minecraft 服务器。 (我的愿望清单上有一个 python minecraft 客户端)。]
  • @DanD。我知道其他人的存在。我查看了几台服务器的来源,但我不明白它们。你能把关于struct.pack() 的事情写成完整的答案吗?

标签: python minecraft


【解决方案1】:

正如 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

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

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2015-08-26
    • 2020-09-03
    相关资源
    最近更新 更多