3

你好 StackOverflow 的好心人。

我正在尝试制作一种可以连接到 Minecraft Classic 服务器、发布消息并可能构建的“机器人”。

无论如何,我在理解如何在 python 中发送数据包以及如何正确编码它们时遇到了一些麻烦。

这是我需要发送的数据包,我想发送“玩家标识”: http: //www.minecraftwiki.net/wiki/Classic_server_protocol#Client_.E2.86.92_Server_packets 我知道我需要使用套接字,并且我需要使用 struct.pack,但我该如何发送呢?

发送登录数据包的示例代码将非常棒。

谢谢。

4

1 回答 1

4

我会让球滚动:

import socket
import struct

username = "username_value"
verification_key = "verification_key"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # boilerplate
s.connect(("example.com", 1234))  # adjust accordingly

# now for the packet
# note that the String type is specified as having a length of 64, we'll pad that

packet = ""

packet += struct.pack("B", 1)  # packet type
packet += struct.pack("B", 7)  # protocol version
packet += "%-64s" % username  # magic!
packet += "%-64s" % verification_key
packet += struct.pack("B", 0)  # that unused byte, assuming a NULL byte here

# send what we've crafted
s.send(packet)

如果您从未使用过格式字符串,“%-20s”可能对您来说很奇怪。本质上..

print "%s" % 5

.. 会打印出 5 ..

print "%10s" % 5

.. 会将输出填充为正好 10 个字符的宽度。但它在右侧填充它们,我们希望在左侧填充 - 因此-..

print "%-10s" % s, "<this will be 9 spaces away from the '5'>"

..玩弄它。

如果有任何不清楚的地方,请告诉我。我喜欢你在做的事情,让我想起了我的一个旧项目。除了我没有像你那样简洁的协议规范,幸运的混蛋。;)

于 2012-03-01T18:35:04.167 回答