HelloOverflow的好朋友。
我正在尝试制作一种可以连接到Minecraft Classic服务器,发布消息并可能构建的'bot'。
无论如何,我在理解如何在python中发送数据包以及如何正确编码它们时遇到了一些麻烦。
以下是我需要发送的数据包,我想发送'玩家识别'一个:http://www.minecraftwiki.net/wiki/Classic_server_protocol#Client_.E2.86.92_Server_packets 我知道我需要使用套接字,我需要使用struct.pack,但我该如何发送呢?
发送登录数据包的示例代码将非常棒。
感谢。
答案 0 :(得分: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'>"
..玩弄它。
如果有任何不清楚的地方,请告诉我。我喜欢你正在做的事情,让我想起了我的一个旧项目。除了我没有像你那样的整洁协议规范,幸运的混蛋。 ;)