*/
NetworkStreamManager _tcpStreamManager = null;
+ /**
+ * Track the outstanding ping ("PONG") replies.
+ *
+ * If this number remains greater than 0 it indicates a problem with the
+ * connection.
+ */
+ private int pingCount = 0;
+
/**
* Default constructor. Sets Logger level and initialises GUI and TCP stream manager.
*/
NetworkStream serverSocial = _tcpStreamManager._tcpStreams.get(NetworkStreamManager.SERVERSOCIAL);
if (serverSocial != null) {
- MessagePresence mp = new MessagePresence("PING", new WSYD_SocketAddress(serverSocial.getLocalAddress(), WSYD_SocketAddress.Protocol.TCP));
- NetworkMessage nm = NetworkMessage.createNetworkMessage("Neighbour", null, mp);
- serverSocial.queueMessage(nm);
+ MessagePresence mp = new MessagePresence( _title, new WSYD_SocketAddress(serverSocial.getLocalAddress(), WSYD_SocketAddress.Protocol.TCP));
+ NetworkMessage nPing = NetworkMessage.createNetworkMessage("PING", "ServerSocial", mp);
+ serverSocial.queueMessage(nPing);
+ pingCount++;
+ if (pingCount >= 5) {
+ // TODO: ping: 5 pings not replied to: assume connection has dropped?
+ }
}
}
MessageLogin ml;
switch (nm.getIntent()) {
case "Neighbour":
+ case "PONG":
if (type.equals(MessagePresence.getType())) { // Presence
MessagePresence mp = (MessagePresence) nm.getMessage();
+ if (nm.getIntent().equals("PONG"))
+ pingCount--;
// add or update the last-seen time of the Sender host in the known services map
ServiceAddressMap.LastSeenHost host = new ServiceAddressMap.LastSeenHost(new InetSocketAddress(nm.getReceivedFrom().getAddress(), mp.socketAddress.getPort()));
this._serviceToAddressMap.put(mp.serviceName, host);
- logp(Level.FINEST, "Added \"{0}\" ({1}) to service map", mp.serviceName, host.address.toString());
+ logp(Level.FINEST, "{2} Added \"{0}\" ({1}) to service map", mp.serviceName, host.address.toString(), nm.getIntent());
switch (mp.serviceName) {
case "ServerChat":
// TODO: NetworkMessageReceived(Neighbour): prepare for keeping ServerChat in sync
}
break;
- case "Pong": // nothing to do - already added to _serviceToAddressMap
- // TODO: NetworkMessageReceived() add timeout logic to detect missing 'PONG' so stream can be closed and user status set to offline
- break;
}
}
break;
logp(Level.CONFIG, "Switched to network logger");
}
break;
- case "PING":
- if (nm.getReceivedFrom().getProtocol() == WSYD_SocketAddress.Protocol.TCP) {
- NetworkStream ns = _tcpStreamManager._tcpStreams.get(nm.getKey());
- if (ns != null) {
- MessagePresence pong = new MessagePresence("PONG", new WSYD_SocketAddress(ns.getLocalAddress(), WSYD_SocketAddress.Protocol.TCP));
- NetworkMessage nmPong = NetworkMessage.createNetworkMessage("Neighbour", null, pong);
- ns.queueMessage(nmPong);
- }
- }
}
}
break;
+ case "PING":
+ if (nm.getReceivedFrom().getProtocol() == WSYD_SocketAddress.Protocol.TCP) {
+ NetworkStream ns = _tcpStreamManager._tcpStreams.get(nm.getKey());
+ if (ns != null) {
+ MessagePresence pong = new MessagePresence(_title, new WSYD_SocketAddress(ns.getLocalAddress(), WSYD_SocketAddress.Protocol.TCP));
+ NetworkMessage nmPong = NetworkMessage.createNetworkMessage("PONG", nm.getSender(), pong);
+ nmPong.setSender(_title);
+ ns.queueMessage(nmPong);
+ }
+ }
+ break;
+
case "Control": // Exit or Restart?
if (type.equals(MessageServerControl.getType())) { // ServerControl
if ("ServerManagement".equals(nm.getSender())) {