package rts.core.network; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import rts.core.network.menu_tcp_containers.ServerState; import rts.utils.Configuration; public class NetworkServerDiscover { private final static int BUFFER_SIZE = 300; private NetworkManager manager; // Listenings private INetworkDiscoverListener listener; private DatagramSocket clientSocket; private DatagramSocket serverSocket; public NetworkServerDiscover(NetworkManager manager) { this.manager = manager; } // Client public void discover() throws IOException { byte leMessage[] = ("Client:infos connection").getBytes(); DatagramPacket packet = new DatagramPacket(leMessage, leMessage.length); packet.setAddress(InetAddress.getByName("255.255.255.255")); packet.setPort(Configuration.getUdpListeningServerPort()); clientSocket.send(packet); } public void launchClientListening(INetworkDiscoverListener l) { this.listener = l; Thread listeningThread = new Thread(new Runnable() { @Override public void run() { try { clientSocket = new DatagramSocket(Configuration.getUdpListeningClientPort()); boolean listen = true; byte buffer[] = new byte[BUFFER_SIZE]; DatagramPacket packet = new DatagramPacket(buffer, BUFFER_SIZE); while (listen) { try { clientSocket.receive(packet); if (packet != null) { String[] datas = new String(packet.getData(), packet.getOffset(), packet.getLength()).split(":"); if (listener != null && datas.length == 5) { listener.receiveServerInfos(datas[0], datas[1], datas[2], datas[3], datas[4], packet.getAddress().getHostAddress()); } } } catch (IOException e) { // e.printStackTrace(); break; } } clientSocket.close(); } catch (SocketException e) { e.printStackTrace(); } finally { if (clientSocket != null && !clientSocket.isClosed()) clientSocket.close(); } } }); listeningThread.start(); } public void stopClientListening() { clientSocket.close(); } // Server public void launchServerListening() { Thread listeningThread = new Thread(new Runnable() { @Override public void run() { try { serverSocket = new DatagramSocket(Configuration.getUdpListeningServerPort()); boolean listen = true; byte buffer[] = new byte[BUFFER_SIZE]; DatagramPacket packet = new DatagramPacket(buffer, BUFFER_SIZE); while (listen) { try { serverSocket.receive(packet); if (packet != null) { ServerState state = manager.getServerState(); state.update(); byte leMessage[] = (state.state + ":" + state.gameType + ":" + state.nbPlayer + ":" + state.nbMaxPlayer + ":" + state.mapName) .getBytes(); serverSocket.send(new DatagramPacket(leMessage, leMessage.length, packet.getAddress(), Configuration .getUdpListeningClientPort())); } } catch (IOException e) { // e.printStackTrace(); break; } } serverSocket.close(); } catch (SocketException e) { e.printStackTrace(); } finally { if (serverSocket != null && !serverSocket.isClosed()) serverSocket.close(); } } }); listeningThread.start(); } public void stopServerListening() { serverSocket.close(); } }