Advertisement
Guest User

Untitled

a guest
Sep 29th, 2013
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.30 KB | None | 0 0
  1. import java.io.IOException;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.CharBuffer;
  5. import java.nio.channels.SelectionKey;
  6. import java.nio.channels.Selector;
  7. import java.nio.charset.Charset;
  8.  
  9. public class ServerPingConnection extends TcpConnection<ServerData> {
  10.     public static final int ERROR_INVALID_PACKET = 0;
  11.  
  12.     private static final byte[] HEADER = {(byte) 0xFE, 0x01, (byte) 0xFA,
  13.             0x00, 0x0B};
  14.     private static final Charset CHARSET = Charset.forName("UTF-16BE");
  15.     private String mHostname;
  16.     private long startTime;
  17.     private ServerData mServer;
  18.  
  19.     public ServerPingConnection(ServerData server, String hostname) {
  20.         super(server.getHost(), server.getPort());
  21.         this.mHostname = hostname;
  22.         mServer = server;
  23.         timeout(3000);
  24.         byteOrder(ByteOrder.BIG_ENDIAN);
  25.     }
  26.  
  27.     @Override
  28.     protected boolean close() {
  29.         return true;
  30.     }
  31.  
  32.     @Override
  33.     public void OnConnect(Selector selector) throws IOException {
  34.         startTime = System.nanoTime();
  35.         super.OnConnect(selector);
  36.     }
  37.  
  38.     @Override
  39.     public void OnWrite(SelectionKey selectionKey, ByteBuffer buffer) throws IOException {
  40.         // HEADER
  41.         buffer.put(HEADER);
  42.         byte[] options = "MC|PingHost".getBytes(CHARSET);
  43.         buffer.put(options);
  44.         buffer.putShort((short) (7 + 2 * mHostname.length()));
  45.         buffer.put((byte) 73);
  46.         buffer.putShort((short) mHostname.length());
  47.         buffer.put(mHostname.getBytes(CHARSET));
  48.         buffer.putInt(25565);
  49.         buffer.flip();
  50.  
  51.         int written = channel.write(buffer);
  52.         Log.i("APP", written + "");
  53.         selectionKey.interestOps(SelectionKey.OP_READ);
  54.     }
  55.  
  56.     @Override
  57.     public void onRead(SelectionKey selectionKey, ByteBuffer buffer) throws IOException {
  58.         int read = channel.read(buffer);
  59.         Log.i("APP", read + "");
  60.         buffer.flip();
  61.         byte type = buffer.get();
  62.         // Error, invalid packet
  63.         if (type != (byte) 0xFF) {
  64.             postError(ERROR_INVALID_PACKET, mServer);
  65.             return;
  66.         }
  67.         int length = buffer.getShort();
  68.  
  69.         CharBuffer charBuffer = Charset.defaultCharset().decode(buffer);
  70.         // decoder will place a null terminator after each string, now there are
  71.         // three because of UTF-16
  72.  
  73.         charBuffer.position(7);
  74.         mServer.setPing((System.nanoTime() - startTime) / 1000000L);
  75.         mServer.setProtocol(Integer.parseInt(readString(charBuffer)));
  76.         mServer.setVersion(readString(charBuffer));
  77.         mServer.setMotd(readString(charBuffer));
  78.         mServer.setPlayerCount(Integer.parseInt(readString(charBuffer)));
  79.         mServer.setMaxPlayers(Integer.parseInt(readString(charBuffer)));
  80.  
  81.         postSuccess(0, mServer);
  82.     }
  83.  
  84.     private static String readString(CharBuffer buffer) {
  85.         // UTF-16 to UTF-8 creates an extra null-byte
  86.         StringBuilder builder = new StringBuilder();
  87.         char c;
  88.         while (buffer.hasRemaining() && (c = buffer.get()) != 0) {
  89.             builder.append(c);
  90.             if (buffer.hasRemaining()) buffer.get(); // skip null byte
  91.         }
  92.  
  93.         if (buffer.hasRemaining()) buffer.get(); // skip null byte
  94.  
  95.         return builder.toString();
  96.     }
  97.  
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement