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);
+}