diff --git a/pom.xml b/pom.xml index fca06536..4ec5f059 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,13 @@ 1.4 + + + javax.jmdns + jmdns + 3.4.1 + + diff --git a/src/main/java/seng302/gameServer/ServerAdvertiser.java b/src/main/java/seng302/gameServer/ServerAdvertiser.java new file mode 100644 index 00000000..04a53b46 --- /dev/null +++ b/src/main/java/seng302/gameServer/ServerAdvertiser.java @@ -0,0 +1,40 @@ +package seng302.gameServer; + +import javax.jmdns.JmDNS; +import javax.jmdns.ServiceInfo; +import java.io.IOException; +import java.net.InetAddress; + +public class ServerAdvertiser { + private static String SERVICE = "_partyatsea_"; + private static String PROTOCOL = "_tcp"; + public static String SERVICE_TYPE = SERVICE + "." + PROTOCOL + ".local"; + private static Integer PROTO_VERSION = 1; + + + private static ServerAdvertiser instance = null; + private static JmDNS jmdnsInstance = null; + + private ServerAdvertiser() throws IOException{ + jmdnsInstance = JmDNS.create(InetAddress.getLocalHost(), InetAddress.getByName(InetAddress.getLocalHost().getHostName()).toString()); + } + + public static ServerAdvertiser getInstance() throws IOException { + if (instance == null){ + instance = new ServerAdvertiser(); + } + + return instance; + } + + public void registerGame(Integer portNo, String serverName, Integer spacesLeft, String mapName) throws IOException { + String serviceData = packageServerData(spacesLeft, mapName, PROTO_VERSION); + ServiceInfo serviceInfo = ServiceInfo.create(SERVICE_TYPE, serverName, portNo, serviceData); + + jmdnsInstance.registerService(serviceInfo); + } + + private String packageServerData(Integer spacesLeft, String mapName, Integer version){ + return spacesLeft.toString() + "|" + mapName + "|" + version.toString(); + } +} diff --git a/src/main/java/seng302/visualiser/ServerListener.java b/src/main/java/seng302/visualiser/ServerListener.java new file mode 100644 index 00000000..47cdf2d2 --- /dev/null +++ b/src/main/java/seng302/visualiser/ServerListener.java @@ -0,0 +1,56 @@ +package seng302.visualiser; + +import seng302.gameServer.ServerAdvertiser; + +import javax.jmdns.JmDNS; +import javax.jmdns.ServiceEvent; +import javax.jmdns.ServiceListener; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class ServerListener{ + private static ServerListener instance; + private ServerListenerDelegate delegate; + private JmDNS jmdns = null; + + private class GameServerListener implements ServiceListener { + GameServerListener(){ + System.out.println("Created GSL instance"); + } + + @Override + public void serviceAdded(ServiceEvent event) { + delegate.serverDetected(event.getName(), "", 123, event.getInfo().getInet4Addresses().toString()); + } + + @Override + public void serviceRemoved(ServiceEvent event) { + delegate.serverRemoved(event.getName()); + } + + @Override + public void serviceResolved(ServiceEvent event) { + // Do nothing + } + } + + private ServerListener() throws IOException { + jmdns = JmDNS.create(InetAddress.getLocalHost()); + jmdns.addServiceListener(ServerAdvertiser.SERVICE_TYPE, new GameServerListener()); + } + + public static ServerListener getInstance() throws IOException { + if (instance == null){ + instance = new ServerListener(); + } + + return instance; + } + + public void setDelegate(ServerListenerDelegate delegate){ + this.delegate = delegate; + } + + +} diff --git a/src/main/java/seng302/visualiser/ServerListenerDelegate.java b/src/main/java/seng302/visualiser/ServerListenerDelegate.java new file mode 100644 index 00000000..83694823 --- /dev/null +++ b/src/main/java/seng302/visualiser/ServerListenerDelegate.java @@ -0,0 +1,6 @@ +package seng302.visualiser; + +public interface ServerListenerDelegate { + void serverDetected(String serverName, String mapName, Integer placesLeft, String serverAddress); + void serverRemoved(String serverName); +}