mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Added basic auto discovery functionality
- Servers can advertise themselves - Clients can detect servers on their local network Tags: #story[1247]
This commit is contained in:
@@ -70,6 +70,13 @@
|
|||||||
<version>1.4</version>
|
<version>1.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/javax.jmdns/jmdns -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.jmdns</groupId>
|
||||||
|
<artifactId>jmdns</artifactId>
|
||||||
|
<version>3.4.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package seng302.visualiser;
|
||||||
|
|
||||||
|
public interface ServerListenerDelegate {
|
||||||
|
void serverDetected(String serverName, String mapName, Integer placesLeft, String serverAddress);
|
||||||
|
void serverRemoved(String serverName);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user