【问题标题】:How to Send Packets to a Remote Minecraft Classic Server in Python?如何使用 Python 将数据包发送到远程 Minecraft Classic 服务器?
【发布时间】:2012-03-20 05:17:36
【问题描述】:

StackOverflow 的各位好心人。

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

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

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

发送登录数据包的示例代码会很棒。

谢谢。

【问题讨论】:

    标签: python sockets minecraft packets


    【解决方案1】:

    我会继续努力的:

    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'>"
    

    .. 玩弄它。

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

    【讨论】:

    • 非常感谢!这正是我想要的,没有比这更有用的了。
    • 您好,您能帮帮我吗?当我尝试连接到 MC Classic Server 时,它给了我错误响应 Incompatible client, or a network error.。我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多