Skip to content

Commit

Permalink
Added broadcast service using UnPnP
Browse files Browse the repository at this point in the history
  • Loading branch information
Sladyn committed Feb 2, 2020
1 parent 34f0f07 commit 1f0cd29
Showing 1 changed file with 46 additions and 51 deletions.
97 changes: 46 additions & 51 deletions engine/src/main/java/org/terasology/network/BroadCastServer.java
Expand Up @@ -19,6 +19,8 @@
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
Expand All @@ -31,19 +33,19 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.config.Config;
import org.terasology.registry.In;
import org.terasology.rendering.nui.layers.mainMenu.JoinGameScreen;


public class BroadCastServer {

private static DatagramSocket socket;

@In
private Config config;

private static boolean turnOnBroadcast;
private static final Logger logger = LoggerFactory.getLogger(JoinGameScreen.class);
private static ScheduledExecutorService service;
private Config config;



public boolean isBroadCastTurnedOn() {
Expand All @@ -55,15 +57,12 @@ public void setTurnOnBroadcast(boolean turnOnBroadcast) {
}

public void startBroadcast() {
String message = buildBroadCastMessage();
service = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = new Runnable() {
public void run() {
try {
logger.info("Broadcasting message" + message);
for (InetAddress inadr : listAllBroadcastAddresses()) {
broadcast(message, inadr);
}
logger.info("Broadcasting message");
broadCast();
} catch (Exception e) {
logger.info("Broadcasting has been interrupted " + e.getMessage());
e.printStackTrace();
Expand All @@ -78,50 +77,46 @@ public void stopBroadCast() {
service.shutdown();
}

/**
* @param broadcastMessage The broadcast Message
* @param address address for which the message needs to be broadcasted
*/
public void broadcast(
String broadcastMessage, InetAddress address) throws IOException {
socket = new DatagramSocket();
socket.setBroadcast(true);

byte[] buffer = broadcastMessage.getBytes();

DatagramPacket packet
= new DatagramPacket(buffer, buffer.length, address, 4445);
socket.send(packet);
socket.close();
}

/**
* @return List of InetAddresses for the network interface
*/
public static List<InetAddress> listAllBroadcastAddresses() throws SocketException {
List<InetAddress> broadcastList = new ArrayList<>();
Enumeration<NetworkInterface> interfaces
= NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();

if (networkInterface.isLoopback() || !networkInterface.isUp()) {
continue;
}

networkInterface.getInterfaceAddresses().stream()
.map(a -> a.getBroadcast())
.filter(Objects::nonNull)
.forEach(broadcastList::add);
private void broadCast() throws Exception {
final int ssdpPort = 1900;
final int ssdpSearchPort = 1901;
// Broadcast address for finding routers.
final String ssdpIP = "239.255.255.250";
int timeout = 5000;
InetAddress localhost = InetAddress.getLocalHost();
// Send from localhost:1901
InetSocketAddress srcAddress = new InetSocketAddress(localhost, ssdpSearchPort);
// Send to 239.255.255.250:1900
InetSocketAddress dstAddress = new InetSocketAddress(InetAddress.getByName(ssdpIP), ssdpPort);
// ----------------------------------------- //
// Construct the request packet. //
// ----------------------------------------- //
StringBuffer discoveryMessage = new StringBuffer();
discoveryMessage.append("M-SEARCH * HTTP/1.1\r\n");
discoveryMessage.append("HOST: " + ssdpIP + ":" + ssdpPort + "\r\n");
discoveryMessage.append("ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n");
// ST: urn:schemas-upnp-org:service:WANIPConnection:1\r\n
discoveryMessage.append("MAN: \"ssdp:discover\"\r\n");
discoveryMessage.append("MX: 2\r\n");
discoveryMessage.append("\r\n");
byte[] discoveryMessageBytes = discoveryMessage.toString().getBytes();
DatagramPacket discoveryPacket = new DatagramPacket(discoveryMessageBytes, discoveryMessageBytes.length, dstAddress);
// ----------------------------------- //
// Send multi-cast packet. //
// ----------------------------------- //
MulticastSocket multicast = null;
try {
multicast = new MulticastSocket(null);
multicast.bind(srcAddress);
multicast.setTimeToLive(4);
System.out.println("Send multicast request.");
// ----- Sending multi-cast packet ----- //
multicast.send(discoveryPacket);
} finally {
System.out.println("Multicast ends. Close connection.");
multicast.disconnect();
multicast.close();
}
return broadcastList;
}


private String buildBroadCastMessage() {
logger.info("Building Broadcast Message");
int serverPort = config.getNetwork().getServerPort();
return "Hello I am running on server" + config.getNetwork().getMasterServer() + "and Port:" + serverPort;
}

}

0 comments on commit 1f0cd29

Please sign in to comment.