*/
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;
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.
*
* @author TJ <hacker@iam.tj>
*/
-public final class ServerSocial {
+public final class ServerSocial implements NetworkMessageEventListener {
/**
* Persistent storage in file-system when server exits.
*/
* userIDs of members currently logged in
*/
ArrayList<Long> _membersOnline;
+
+ /**
+ *
+ */
+ WSYD_SocketAddress _multicastAdvertiserSA;
+
+ /**
+ *
+ */
+ NetworkServerUDPMulticast _multicastServer;
+ Timer _multicastAnnounce;
/**
* Default constructor.
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
*
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;
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.
*/
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");