Hallo Leute,
ich wollte ein wenig mit Java Spielen und möchte gerne die SpielerListe + Namen eines Servers auslesen.
Am Anfang habe ich eine Packet ID an den Server geschickt und habe dafür MOTD, Spieler und MaxSpieler auslesen können (http://www.wiki.vg/Protocol#Server_List_Ping_.280xFE.29)
Nun habe ich mein Ziel aber nicht erreicht und habe weiter gesucht. Nach einiger Zeit habe ich dann diese Seite gefunden: http://www.wiki.vg/Query
Nachdem ich mich ein wenig informiert habe habe ich es zustande bekommen einen Token mittels des Handshakes als Paket zu empfangen. Danach wollte ich die BasicStats auslesen und dafür benötige ich den Token. Nur weiß ich nicht ganz wie das ganze aussehen muss. Das Paket muss ca. so aussehen: FE FD 00 00 00 00 01 00 91 29 5B
Wobei vier der Bytes durch den Token ersetzt werden müssen...
- out.println("<p>Beginne...</p>");
- //Adresse/Socket
- int port = 25565;
- String host = "server.herobrine.de";
- InetSocketAddress address = new InetSocketAddress(host, port);
- DatagramSocket socket = new DatagramSocket();
- socket.setSoTimeout(4000);
- //handshake
- byte[] h_recv = new byte[10240];
- byte[] h_message = new byte[7];
- //status
- byte[] s_recv = new byte[10240];
- byte[] s_message = new byte[11];
- h_message[0] = (byte) 0xFE;
- h_message[1] = (byte) 0xFD;
- h_message[2] = (byte) 0x09;
- h_message[3] = (byte) 0x01;
- h_message[4] = (byte) 0x01;
- h_message[5] = (byte) 0x01;
- h_message[6] = (byte) 0x01;
- DatagramPacket send_packet = new DatagramPacket(h_message, h_message.length, address.getAddress(), address.getPort());
- socket.send(send_packet);
- DatagramPacket recv_packet = new DatagramPacket(h_recv, h_recv.length);
- socket.receive(recv_packet);
- socket.close();
- String answere = new String(h_recv, "Cp1252");
- out.println("<p> Token: "+ answere +"</p>");
Nach erfolglosen probieren wende ich mich nun an euch. Ich habe mir den Beispielcode angeschaut und mein jetziger Code sieht so aus:
- /*
- final int challengeInteger;
- {
- byte byte1 = -1;
- int i = 0;
- byte[] buffer = new byte[8];
- for(int count = 5; (byte1 = h_recv[count++]) != 0;)
- buffer[i++] = byte1;
- challengeInteger = Integer.parseInt(new String(buffer).trim());
- }
- s_message[0] = (byte) 0xFE;
- s_message[1] = (byte) 0xFD;
- s_message[2] = (byte) 0x00;
- s_message[3] = (byte) 0x01;
- s_message[4] = (byte) 0x01;
- s_message[4] = (byte) 0x01;
- s_message[5] = (byte) 0x01;
- s_message[6] = (byte) (challengeInteger >> 24);
- s_message[7] = (byte) (challengeInteger >> 16);
- s_message[8] = (byte) (challengeInteger >> 8);
- s_message[9] = (byte) challengeInteger;
- packet = new DatagramPacket (s_message, s_message.length, address.getAddress(), address.getPort());
- socket.send(packet);
- packet = new DatagramPacket(s_recv, s_recv.length);
- socket.receive(dp);
- answere = new String(s_recv, "Cp1252");
- out.println("<p> ABC: "+ answere +"</p>");
- */
Nach einigen versuchen habe ich dann ein Stück von dem Beispielcode kopiert: https://github.com/ryanshawty/…ryanshaw/Query/Query.java
Doch leider verstehe ich den nicht ganz. :X