ClientGUI, ServerSocial: make PING-PONG an Intent and count outstanding PINGs
authorTJ <hacker@iam.tj>
Sun, 7 Jun 2015 21:13:31 +0000 (22:13 +0100)
committerEddie <dev@fun2be.me>
Mon, 8 Jun 2015 04:41:18 +0000 (05:41 +0100)
src/uk/ac/ntu/n0521366/wsyd/client/ClientGUI.java
src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java

index 5b32a73..1ede938 100644 (file)
@@ -192,6 +192,14 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
      */
     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.
      */
@@ -548,9 +556,13 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
 
                 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?
+                    }
                 }
 
             }
@@ -775,12 +787,15 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
         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
@@ -796,9 +811,6 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
                             }
                             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;
index 92118fb..04e737b 100644 (file)
@@ -531,19 +531,22 @@ public final class ServerSocial implements NetworkMessageEventListener, Connecti
                                 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())) {