PingID(数据)在不同方面有所不同

时间:2015-01-19 05:58:08

标签: java networking io minecraft packets

我正在为Minecraft:Pocket Edition开发服务器软件。现在我正在为服务器的MOTD工作,它工作正常。使用0x1c向ping数据包(0x01)发送响应时。它显示在世界列表中,名称很好。但是,由于某种原因,如果我从另一个程序发送相同的数据,Ping ID和ServerID将在控制台中显示不同。这是为什么?

Ping响应代码:

public PingResponse(DatagramPacket Packet, long ServerID) throws IOException {
    // Data from Ping
    ByteBuffer ReceivedPing = ByteBuffer.wrap(Packet.getData());

    // Set variables
    this.ServerID = ServerID;
    this.ServerName = ServerPropertiesHandler.getMOTD();
    this.PingID = ReceivedPing.getLong();

    // Server Name
    String Identifier = "MCCPP;MINECON;" + ServerPropertiesHandler.getMOTD();
    ByteBuffer PingResponseBuffer = ByteBuffer.allocate(35 + (short) Identifier.length());

    // Put Packet ID
    PingResponseBuffer.put(PacketIDList.ID_UNCONNECTED_PING_OPEN_CONNECTIONS);

    // Ping ID
    PingResponseBuffer.putLong(this.PingID);
    System.out.println("Ping ID: " + this.PingID);

    // Server ID
    PingResponseBuffer.putLong(this.ServerID);
    System.out.println("Server ID: " + this.ServerID);

    // Sugar Spice and everything nice
    PingResponseBuffer.put(PacketIDList.MAGIC);

    // Server Name
    PingResponseBuffer.putShort((short) Identifier.length());
    PingResponseBuffer.put(Identifier.getBytes());

    // Send
    PacketHandler.Socket.send(new DatagramPacket(PingResponseBuffer.array(), PingResponseBuffer.array().length), Packet.getAddress(), Packet.getPort());
}

客户案例:

public static void main(String[] args) {
    try {
        // SEND
        final long PacketID = new Random().nextLong();
        DatagramSocket ClientSocket = new DatagramSocket();
        ByteBuffer PingBuffer = ByteBuffer.allocate(25);
        PingBuffer.put(PacketIDList.ID_CONNECTED_PING_OPEN_CONNECTIONS);
        PingBuffer.putLong(PacketID);
        PingBuffer.put(PacketIDList.MAGIC);
        ClientSocket.send(new DatagramPacket(PingBuffer.array(), PingBuffer.array().length, InetAddress.getByName("localhost"), 19132));

        // RECEIVE
        byte[] buffer = new byte[1535];
        DatagramPacket PongPacket = new DatagramPacket(buffer, buffer.length);
        ClientSocket.receive(PongPacket);
        byte[] PongPacketData = PongPacket.getData();
        ByteBuffer PongBuffer = ByteBuffer.wrap(PongPacketData);
        if(PongPacketData[0] == (byte) 0x1c) {
            System.out.println("PingID From Server: " + PongBuffer.getLong());
            System.out.println("ServerID From Server: " + PongBuffer.getLong());
            System.out.println("MAGIC From Server: " + PongBuffer.get());
            System.out.println("MOTD From Server: " + PongBuffer.get());
        }
        else {
            System.out.println("UNKNOWN PACKET");
        }
        ClientSocket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

3个月没有回复。 pingID和serverID是各个系统上用于确定自启动以来的时间的标识符。这些提供了双重功能。首先,它们允许服务器确定通信中的任何延迟。其次,它们有助于为命令提供数据包顺序。重新启动服务器将从0开始生成新的serverID,而重新加入服务器将提供从0开始的新pingID。

我很有兴趣看到你所取得的进步,因为我已经开始独立工作了。