@@ -48,73 +48,79 @@ private static void writeVarInt(DataOutputStream out, int paramInt) throws IOExc
4848 }
4949
5050 public StatusResponse ping (InetSocketAddress host , int timeout ) throws IOException {
51- try (Socket socket = new Socket ()) {
52- socket .setSoTimeout (timeout );
53- socket .connect (host , timeout );
54-
55- try (DataOutputStream dataOutputStream = new DataOutputStream (socket .getOutputStream ());
56- DataInputStream dataInputStream = new DataInputStream (socket .getInputStream ())) {
57- ByteArrayOutputStream b = new ByteArrayOutputStream ();
58- DataOutputStream handshake = new DataOutputStream (b );
59- handshake .writeByte (0x00 ); //packet id for handshake
60- writeVarInt (handshake , 4 ); //protocol version
61- writeVarInt (handshake , host .getHostString ().length ()); //host length
62- handshake .writeBytes (host .getHostString ()); //host string
63- handshake .writeShort (host .getPort ()); //port
64- writeVarInt (handshake , 1 ); //state (1 for handshake)
65-
66- writeVarInt (dataOutputStream , b .size ()); //prepend size
67- dataOutputStream .write (b .toByteArray ()); //write handshake packet
68-
69-
70- dataOutputStream .writeByte (0x01 ); //size is only 1
71- dataOutputStream .writeByte (0x00 ); //packet id for ping
72- int size = readVarInt (dataInputStream ); //size of packet
73- int id = readVarInt (dataInputStream ); //packet id
74-
75- if (id == -1 ) {
76- throw new IOException ("Premature end of stream." );
77- }
78-
79- if (id != 0x00 ) { //we want a status response
80- throw new IOException ("Invalid packetID" );
81- }
82-
83- int length = readVarInt (dataInputStream ); //length of json string
84- if (length == -1 ) {
85- throw new IOException ("Premature end of stream." );
86- }
87-
88- if (length == 0 ) {
89- throw new IOException ("Invalid string length." );
90- }
91-
92- byte [] in = new byte [length ];
93- dataInputStream .readFully (in ); //read json string
94- String json = new String (in );
95-
96-
97- long now = System .currentTimeMillis ();
98- dataOutputStream .writeByte (0x09 ); //size of packet
99- dataOutputStream .writeByte (0x01 ); //0x01 for ping
100- dataOutputStream .writeLong (now ); //time!?
101-
102- readVarInt (dataInputStream );
103- id = readVarInt (dataInputStream );
104- if (id == -1 ) {
105- throw new IOException ("Premature end of stream." );
106- }
107-
108- if (id != 0x01 ) {
109- throw new IOException ("Invalid packetID" );
110- }
111-
112- long pingTime = dataInputStream .readLong (); //read response
113- StatusResponse response = gson .fromJson (json , StatusResponse .class );
114- response .time = (int ) (now - pingTime );
115- return response ;
116- }
51+ Socket socket = new Socket ();
52+
53+ socket .setSoTimeout (timeout );
54+ socket .connect (host , timeout );
55+
56+ DataOutputStream dataOutputStream = new DataOutputStream (socket .getOutputStream ());
57+ DataInputStream dataInputStream = new DataInputStream (socket .getInputStream ());
58+
59+ ByteArrayOutputStream byteArrStream = new ByteArrayOutputStream ();
60+ DataOutputStream handshake = new DataOutputStream (byteArrStream );
61+ handshake .writeByte (0x00 ); //packet id for handshake
62+ writeVarInt (handshake , 4 ); //protocol version
63+ writeVarInt (handshake , host .getHostString ().length ()); //host length
64+ handshake .writeBytes (host .getHostString ()); //host string
65+ handshake .writeShort (host .getPort ()); //port
66+ writeVarInt (handshake , 1 ); //state (1 for handshake)
67+ handshake .close (); // close handshake packet write stream
68+
69+ writeVarInt (dataOutputStream , byteArrStream .size ()); //prepend size
70+ dataOutputStream .write (byteArrStream .toByteArray ()); //write handshake packet
71+
72+ dataOutputStream .writeByte (0x01 ); //size is only 1
73+ dataOutputStream .writeByte (0x00 ); //packet id for ping
74+
75+ int size = readVarInt (dataInputStream ); //size of packet
76+ int id = readVarInt (dataInputStream ); //packet id
77+
78+ if (id == -1 ) {
79+ throw new IOException ("Premature end of stream." );
80+ }
81+
82+ if (id != 0x00 ) { //we want a status response
83+ throw new IOException ("Invalid packetID" );
84+ }
85+
86+ int length = readVarInt (dataInputStream ); //length of json string
87+ if (length == -1 ) {
88+ throw new IOException ("Premature end of stream." );
11789 }
90+
91+ if (length == 0 ) {
92+ throw new IOException ("Invalid string length." );
93+ }
94+
95+ byte [] in = new byte [length ];
96+ dataInputStream .readFully (in ); //read json string
97+ String json = new String (in );
98+
99+ long now = System .currentTimeMillis ();
100+ dataOutputStream .writeByte (0x09 ); //size of packet
101+ dataOutputStream .writeByte (0x01 ); //0x01 for ping
102+ dataOutputStream .writeLong (now ); //time!?
103+
104+ dataOutputStream .close (); // close request write stream
105+
106+ readVarInt (dataInputStream );
107+ id = readVarInt (dataInputStream );
108+ if (id == -1 ) {
109+ throw new IOException ("Premature end of stream." );
110+ }
111+
112+ if (id != 0x01 ) {
113+ throw new IOException ("Invalid packetID" );
114+ }
115+
116+ long pingTime = dataInputStream .readLong (); //read response
117+ StatusResponse response = gson .fromJson (json , StatusResponse .class );
118+ response .time = (int ) (now - pingTime );
119+
120+ dataInputStream .close (); // close response read stream
121+ socket .close (); // close socket
122+
123+ return response ;
118124 }
119125
120126 public static class StatusResponse {
0 commit comments