From: Eddie Date: Sat, 2 May 2015 20:21:16 +0000 (+0100) Subject: Created MessageServerControl X-Git-Url: https://iam.tj/gitweb/gitweb.cgi?p=WeStealzYourDataz.git;a=commitdiff_plain;h=65a3e9987505e8748f7a5cbac6f7913ea20126c1 Created MessageServerControl Added SocialServer multicast handling --- diff --git a/src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java b/src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java index 836c6d3..5a2c8ac 100644 --- a/src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java +++ b/src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java @@ -23,6 +23,8 @@ */ package uk.ac.ntu.n0521366.wsyd.server; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.Date; import java.util.ArrayList; import java.text.SimpleDateFormat; @@ -45,9 +47,20 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.IOException; import java.io.FileNotFoundException; +import java.net.SocketException; import java.util.Arrays; +import java.util.logging.LogRecord; +import javax.swing.Timer; import uk.ac.ntu.n0521366.wsyd.libs.WSYD_Member; import uk.ac.ntu.n0521366.wsyd.libs.WSYD_Member_Comparator_UserID; +import uk.ac.ntu.n0521366.wsyd.libs.message.MessagePresence; +import uk.ac.ntu.n0521366.wsyd.libs.message.MessageServerControl; +import uk.ac.ntu.n0521366.wsyd.libs.net.Network; +import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessage; +import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessageEvent; +import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkServerUDPMulticast; +import uk.ac.ntu.n0521366.wsyd.libs.net.WSYD_SocketAddress; +import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessageEventListener; /** * The main Social Network server. @@ -58,7 +71,7 @@ import uk.ac.ntu.n0521366.wsyd.libs.WSYD_Member_Comparator_UserID; * * @author TJ */ -public final class ServerSocial { +public final class ServerSocial implements NetworkMessageEventListener { /** * Persistent storage in file-system when server exits. */ @@ -100,7 +113,18 @@ public final class ServerSocial { * userIDs of members currently logged in */ ArrayList _membersOnline; + + /** + * + */ + WSYD_SocketAddress _multicastAdvertiserSA; + + /** + * + */ + NetworkServerUDPMulticast _multicastServer; + Timer _multicastAnnounce; /** * Default constructor. @@ -112,7 +136,50 @@ public final class ServerSocial { readMembers(_membersFile); _membersOnline = new ArrayList<>(); } + + /** + * Init listener + */ + ServerSocial InitListeners() + { + _multicastAdvertiserSA = new WSYD_SocketAddress(Network.MULTICAST_IP, Network.PORTS_MULTICAST_DISCOVERY, WSYD_SocketAddress.Protocol.UDP); + _multicastServer = new NetworkServerUDPMulticast(_multicastAdvertiserSA, "ServerSocial", LOGGER); + _multicastServer.addNetworkMessageEventListener(this, "Neighbour"); + _multicastServer.execute(); + + ActionListener multicastAnnounceActionListener = new ActionListener() { + /** + * Activated by timer events to send multi-cast neighbour announcements for the Log Service. + * @param e + */ + @Override + public void actionPerformed(ActionEvent e) { + LOGGER.log(Level.INFO, "Neighbour advert"); + // Announce the Social Server service + MessagePresence mp = new MessagePresence("ServerSocial", Network.PORTS_SERVER_SOCIAL); + NetworkMessage nm = NetworkMessage.createNetworkMessage("Neighbour", "all", mp); + nm.setSender("ServerSocial"); + _multicastServer.queueMessage(nm); + + // clean up the known hosts map and keep Server menu up-to-date + ArrayList servicesRemoved = _multicastServer.cleanServiceToHostMap(5000); + for (String service: servicesRemoved) { + switch (service) { + + } + } + + } + }; + + _multicastAnnounce = new Timer(1000, multicastAnnounceActionListener); + _multicastAnnounce.setInitialDelay(100); + _multicastAnnounce.start(); + + return this; + } + /** * Main execution loop of the server * @@ -133,6 +200,17 @@ public final class ServerSocial { if (loopCount-- == 0) ServerSocial.exitRequested = true; } + /*try + { + _multicastServer.serverClose(); + } + catch (SocketException e) + { + //TODO: Do something + }*/ + _multicastServer.cancel(true); + _multicastAnnounce.stop(); + result = writeMembers(_membersFile); return result; @@ -300,6 +378,25 @@ public final class ServerSocial { return result; } + + @Override + public void NetworkMessageReceived(NetworkMessageEvent event) + { + //TODO: NetworkMessageReceived: Handle Messages + NetworkMessage nm = event.getNetworkMessage(); + if (nm == null) + return; + //Exit or Restart? + if ("Neighbour".equals(nm.getIntent())) + { + String type = nm.getMessage().getMessageType(); + if (type.equals(MessageServerControl.getType())) { // ServerControl + MessageServerControl mp = (MessageServerControl)nm.getMessage(); + if (mp.exitReq == true) ServerSocial.exitRequested = true; + if (mp.restartReq == true) ServerSocial.restartRequested = true; + } + } + } /** * Entry point which starts, restarts, and exits the application. @@ -309,7 +406,7 @@ public final class ServerSocial { */ public static void main(String[] args) throws InterruptedException { while (!ServerSocial.exitRequested && ServerSocial.restartRequested) { - ServerSocial app = new ServerSocial(); + ServerSocial app = new ServerSocial().InitListeners(); ServerSocial.restartRequested = false; if (!app.start()) { System.err.println("Encountered error running Social Server");