Created MessageServerControl
authorEddie <dev@fun2be.me>
Sat, 2 May 2015 20:21:16 +0000 (21:21 +0100)
committerEddie <dev@fun2be.me>
Sat, 2 May 2015 20:21:16 +0000 (21:21 +0100)
Added SocialServer multicast handling

src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java

index 836c6d3..5a2c8ac 100644 (file)
@@ -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 <hacker@iam.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<Long> _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<String> 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");