package sk.tomsik68.mclauncher.impl.servers; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import sk.tomsik68.mclauncher.api.servers.ServerInfo; import javax.net.SocketFactory; import java.io.DataInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketImplFactory; import java.util.concurrent.Callable; final class ServerPinger implements Callable<ServerPingResult> { private final ServerPingPacketFactory pingPacketFactory; private final ServerInfo server; public ServerPinger(ServerInfo server, ServerPingPacketFactory pingPacketFactory) { this.server = server; this.pingPacketFactory = pingPacketFactory; } public ServerPingResult call() throws Exception { ServerPingResult result = null; // open a connection InetSocketAddress addr = InetSocketAddress.createUnresolved(server.getIP(), server.getPort()); Socket socket = SocketFactory.getDefault().createSocket(); socket.connect(addr); // get streams InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); OutputStream os = socket.getOutputStream(); // send data os.write(pingPacketFactory.createPingPacket(server)); // wait for data while (is.available() == 0) { Thread.sleep(20l); } // receive data byte zero = dis.readByte(); if (zero != 0) { return new ServerPingResult(new RuntimeException("Outdated protocol!")); } String jsonString = dis.readUTF(); result = new ServerPingResult(new JSONPingedServerInfo47((JSONObject)JSONValue.parse(jsonString), server.getIP(), server.getName(), server.getPort())); socket.close(); return null; } }