import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
+import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Arrays;
import java.util.logging.LogRecord;
import uk.ac.ntu.n0521366.wsyd.libs.net.WSYD_SocketAddress;
import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkMessageEventListener;
import uk.ac.ntu.n0521366.wsyd.libs.net.NetworkServerUDP;
+import uk.ac.ntu.n0521366.wsyd.libs.net.ServiceAddressMap;
+import uk.ac.ntu.n0521366.wsyd.libs.net.ServiceAddressMap.LastSeenHost;
/**
* The main Social Network server.
*/
static final String _testData = "WSYD_TestData.csv";
+ /**
+ * Readable/displayable name of this application
+ */
+ final String _title = "ServerSocial";
+
+ /**
+ * Network services to address map.
+ */
+ ServiceAddressMap _serviceToAddressMap;
+
/**
* Indicates to start() loop and main() methods to exit completely.
*/
/**
*
*/
- NetworkServerUDPMulticast _multicastServer;
+ NetworkServerUDPMulticast _multicastService;
- Timer _multicastAnnounce;
+ Timer _servicesAnnounce;
- WSYD_SocketAddress _udpServerSA;
+ WSYD_SocketAddress _udpControlServiceSA;
- NetworkServerUDP _udpServer;
+ NetworkServerUDP _udpControlService;
/**
String[] className = this.getClass().getName().split("\\.");
LOGGER = Logger.getLogger(className[className.length - 1]);
LOGGER.setLevel(Level.ALL);
+ _serviceToAddressMap = new ServiceAddressMap(_title, LOGGER);
readMembers(_membersFile);
_membersOnline = new ArrayList<>();
}
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();
+ _multicastService = new NetworkServerUDPMulticast(_multicastAdvertiserSA, _title + "MC", _serviceToAddressMap, LOGGER);
+ _multicastService.addNetworkMessageEventListener(this, "Neighbour");
+ _multicastService.execute();
+ _serviceToAddressMap.put("all", new LastSeenHost(new InetSocketAddress(Network.MULTICAST_IP, Network.PORTS_MULTICAST_DISCOVERY), LastSeenHost.STATE.STATIC));
- _udpServerSA = new WSYD_SocketAddress(Network.IPv4_WILDCARD, Network.PORTS_CLIENT_CONTROL_FIRST, WSYD_SocketAddress.Protocol.UDP);
- _udpServer = new NetworkServerUDP(_udpServerSA, "ServerSocial", LOGGER);
- _udpServer.addNetworkMessageEventListener(this, "Control");
- _udpServer.execute();
+ _udpControlServiceSA = new WSYD_SocketAddress(Network.IPv4_WILDCARD, Network.PORTS_EPHEMERAL, WSYD_SocketAddress.Protocol.UDP);
+ _udpControlService = new NetworkServerUDP(_udpControlServiceSA, _title + "Control", _serviceToAddressMap, LOGGER);
+ _udpControlService.addNetworkMessageEventListener(this, "Control");
+ _udpControlService.execute();
- ActionListener multicastAnnounceActionListener = new ActionListener() {
+ ActionListener servicesAnnounceActionListener = new ActionListener() {
/**
- * Activated by timer events to send multi-cast neighbour announcements for the Log Service.
+ * Activated by timer events to send multi-cast neighbour announcements and other regular notifications.
* @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);
+ // Announce the Social Server Neighbour service
+ MessagePresence mp = new MessagePresence(_title, _multicastService.getSocketAddress());
NetworkMessage nm = NetworkMessage.createNetworkMessage("Neighbour", "all", mp);
- nm.setSender("ServerSocial");
- _multicastServer.queueMessage(nm);
+ nm.setSender(_title + "MC");
+ _multicastService.queueMessage(nm);
+ LOGGER.log(Level.INFO, "Neighbour advert");
+
+ // Notify ServerManagement of the Social Server Control service
+ String target = "ServerManagementControl";
+ LastSeenHost targetHost = _serviceToAddressMap.get(target);
+ if (targetHost != null) {
+ mp = new MessagePresence(_title + "Control", _udpControlService.getSocketAddress());
+ nm = NetworkMessage.createNetworkMessage("Control", target, mp);
+ nm.setSender(_title + "Control");
+ try {
+ _udpControlService.queueMessage(nm);
+ LOGGER.log(Level.INFO, "Control notification sent to ServerManagement");
+ } catch (IllegalArgumentException ex) {
+ // Not fatal - ServerManagement may not be currently known
+ }
+ }
- // clean up the known hosts map and keep Server menu up-to-date
- ArrayList<String> servicesRemoved = _multicastServer.cleanServiceToHostMap(5000);
+ // clean up the known hosts map
+ ArrayList<String> servicesRemoved = _serviceToAddressMap.cleanServiceAddressMap(5000);
for (String service: servicesRemoved) {
- switch (service) {
-
- }
+ // FIXME: does the process care if hosts have been removed? if not, remove this array iteration
+ switch (service) {
+ }
}
}
};
- _multicastAnnounce = new Timer(1000, multicastAnnounceActionListener);
- _multicastAnnounce.setInitialDelay(100);
- _multicastAnnounce.start();
+ _servicesAnnounce = new Timer(1000, servicesAnnounceActionListener);
+ _servicesAnnounce.setInitialDelay(100);
+ _servicesAnnounce.start();
return this;
}
{
//TODO: Do something
}*/
- _multicastAnnounce.stop();
- _multicastServer.cancel(true);
- _udpServer.cancel(true);
+ _servicesAnnounce.stop();
+ _multicastService.cancel(true);
+ _udpControlService.cancel(true);
result = writeMembers(_membersFile);
@Override
public void NetworkMessageReceived(NetworkMessageEvent event)
{
- System.err.println("Packet received.");
//TODO: NetworkMessageReceived: Handle Messages
NetworkMessage nm = event.getNetworkMessage();
if (nm == null)
return;
//Exit or Restart?
- System.err.println(nm.getIntent());
+ System.err.println("Packet Received for intent " + nm.getIntent());
if ("Control".equals(nm.getIntent()))
{
String type = nm.getMessage().getMessageType();
- if (type.equals(MessageServerControl.getType())) { // ServerControl
- MessageServerControl mp = (MessageServerControl)nm.getMessage();
- if (mp.exitReq == MessageServerControl.EXIT.YES) ServerSocial.exitRequested = true;
- if (mp.restartReq == MessageServerControl.RESTART.YES) ServerSocial.restartRequested = true;
- }
+ if (type.equals(MessageServerControl.getType())) { // ServerControl
+ if ("ServerManagement".equals(nm.getSender())) {
+ MessageServerControl mp = (MessageServerControl)nm.getMessage();
+ if (mp.exitReq == MessageServerControl.EXIT.YES) ServerSocial.exitRequested = true;
+ if (mp.restartReq == MessageServerControl.RESTART.YES) ServerSocial.restartRequested = true;
+ }
+ }
}
}