Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.nio.CharBuffer;
- import java.nio.channels.SelectionKey;
- import java.nio.channels.Selector;
- import java.nio.charset.Charset;
- public class ServerPingConnection extends TcpConnection<ServerData> {
- public static final int ERROR_INVALID_PACKET = 0;
- private static final byte[] HEADER = {(byte) 0xFE, 0x01, (byte) 0xFA,
- 0x00, 0x0B};
- private static final Charset CHARSET = Charset.forName("UTF-16BE");
- private String mHostname;
- private long startTime;
- private ServerData mServer;
- public ServerPingConnection(ServerData server, String hostname) {
- super(server.getHost(), server.getPort());
- this.mHostname = hostname;
- mServer = server;
- timeout(3000);
- byteOrder(ByteOrder.BIG_ENDIAN);
- }
- @Override
- protected boolean close() {
- return true;
- }
- @Override
- public void OnConnect(Selector selector) throws IOException {
- startTime = System.nanoTime();
- super.OnConnect(selector);
- }
- @Override
- public void OnWrite(SelectionKey selectionKey, ByteBuffer buffer) throws IOException {
- // HEADER
- buffer.put(HEADER);
- byte[] options = "MC|PingHost".getBytes(CHARSET);
- buffer.put(options);
- buffer.putShort((short) (7 + 2 * mHostname.length()));
- buffer.put((byte) 73);
- buffer.putShort((short) mHostname.length());
- buffer.put(mHostname.getBytes(CHARSET));
- buffer.putInt(25565);
- buffer.flip();
- int written = channel.write(buffer);
- Log.i("APP", written + "");
- selectionKey.interestOps(SelectionKey.OP_READ);
- }
- @Override
- public void onRead(SelectionKey selectionKey, ByteBuffer buffer) throws IOException {
- int read = channel.read(buffer);
- Log.i("APP", read + "");
- buffer.flip();
- byte type = buffer.get();
- // Error, invalid packet
- if (type != (byte) 0xFF) {
- postError(ERROR_INVALID_PACKET, mServer);
- return;
- }
- int length = buffer.getShort();
- CharBuffer charBuffer = Charset.defaultCharset().decode(buffer);
- // decoder will place a null terminator after each string, now there are
- // three because of UTF-16
- charBuffer.position(7);
- mServer.setPing((System.nanoTime() - startTime) / 1000000L);
- mServer.setProtocol(Integer.parseInt(readString(charBuffer)));
- mServer.setVersion(readString(charBuffer));
- mServer.setMotd(readString(charBuffer));
- mServer.setPlayerCount(Integer.parseInt(readString(charBuffer)));
- mServer.setMaxPlayers(Integer.parseInt(readString(charBuffer)));
- postSuccess(0, mServer);
- }
- private static String readString(CharBuffer buffer) {
- // UTF-16 to UTF-8 creates an extra null-byte
- StringBuilder builder = new StringBuilder();
- char c;
- while (buffer.hasRemaining() && (c = buffer.get()) != 0) {
- builder.append(c);
- if (buffer.hasRemaining()) buffer.get(); // skip null byte
- }
- if (buffer.hasRemaining()) buffer.get(); // skip null byte
- return builder.toString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement