Close resources on ServerListPing

Might fix #5
This commit is contained in:
Jaime 2018-12-30 15:02:29 +01:00
parent 7ff5411e76
commit 9873a645f8

View File

@ -48,73 +48,79 @@ public final class ServerListPing {
} }
public StatusResponse ping(InetSocketAddress host, int timeout) throws IOException { public StatusResponse ping(InetSocketAddress host, int timeout) throws IOException {
try (Socket socket = new Socket()) { Socket socket = new Socket();
socket.setSoTimeout(timeout);
socket.connect(host, timeout);
try (DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); socket.setSoTimeout(timeout);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream())) { socket.connect(host, timeout);
ByteArrayOutputStream b = new ByteArrayOutputStream();
DataOutputStream handshake = new DataOutputStream(b);
handshake.writeByte(0x00); //packet id for handshake
writeVarInt(handshake, 4); //protocol version
writeVarInt(handshake, host.getHostString().length()); //host length
handshake.writeBytes(host.getHostString()); //host string
handshake.writeShort(host.getPort()); //port
writeVarInt(handshake, 1); //state (1 for handshake)
writeVarInt(dataOutputStream, b.size()); //prepend size DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.write(b.toByteArray()); //write handshake packet DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
ByteArrayOutputStream byteArrStream = new ByteArrayOutputStream();
DataOutputStream handshake = new DataOutputStream(byteArrStream);
handshake.writeByte(0x00); //packet id for handshake
writeVarInt(handshake, 4); //protocol version
writeVarInt(handshake, host.getHostString().length()); //host length
handshake.writeBytes(host.getHostString()); //host string
handshake.writeShort(host.getPort()); //port
writeVarInt(handshake, 1); //state (1 for handshake)
handshake.close(); // close handshake packet write stream
dataOutputStream.writeByte(0x01); //size is only 1 writeVarInt(dataOutputStream, byteArrStream.size()); //prepend size
dataOutputStream.writeByte(0x00); //packet id for ping dataOutputStream.write(byteArrStream.toByteArray()); //write handshake packet
int size = readVarInt(dataInputStream); //size of packet
int id = readVarInt(dataInputStream); //packet id
if (id == -1) { dataOutputStream.writeByte(0x01); //size is only 1
throw new IOException("Premature end of stream."); dataOutputStream.writeByte(0x00); //packet id for ping
}
if (id != 0x00) { //we want a status response int size = readVarInt(dataInputStream); //size of packet
throw new IOException("Invalid packetID"); int id = readVarInt(dataInputStream); //packet id
}
int length = readVarInt(dataInputStream); //length of json string if (id == -1) {
if (length == -1) { throw new IOException("Premature end of stream.");
throw new IOException("Premature end of stream.");
}
if (length == 0) {
throw new IOException("Invalid string length.");
}
byte[] in = new byte[length];
dataInputStream.readFully(in); //read json string
String json = new String(in);
long now = System.currentTimeMillis();
dataOutputStream.writeByte(0x09); //size of packet
dataOutputStream.writeByte(0x01); //0x01 for ping
dataOutputStream.writeLong(now); //time!?
readVarInt(dataInputStream);
id = readVarInt(dataInputStream);
if (id == -1) {
throw new IOException("Premature end of stream.");
}
if (id != 0x01) {
throw new IOException("Invalid packetID");
}
long pingTime = dataInputStream.readLong(); //read response
StatusResponse response = gson.fromJson(json, StatusResponse.class);
response.time = (int) (now - pingTime);
return response;
}
} }
if (id != 0x00) { //we want a status response
throw new IOException("Invalid packetID");
}
int length = readVarInt(dataInputStream); //length of json string
if (length == -1) {
throw new IOException("Premature end of stream.");
}
if (length == 0) {
throw new IOException("Invalid string length.");
}
byte[] in = new byte[length];
dataInputStream.readFully(in); //read json string
String json = new String(in);
long now = System.currentTimeMillis();
dataOutputStream.writeByte(0x09); //size of packet
dataOutputStream.writeByte(0x01); //0x01 for ping
dataOutputStream.writeLong(now); //time!?
dataOutputStream.close(); // close request write stream
readVarInt(dataInputStream);
id = readVarInt(dataInputStream);
if (id == -1) {
throw new IOException("Premature end of stream.");
}
if (id != 0x01) {
throw new IOException("Invalid packetID");
}
long pingTime = dataInputStream.readLong(); //read response
StatusResponse response = gson.fromJson(json, StatusResponse.class);
response.time = (int) (now - pingTime);
dataInputStream.close(); // close response read stream
socket.close(); // close socket
return response;
} }
public static class StatusResponse { public static class StatusResponse {