ClientGUI, ServerSocial: introduce TCP PING-PONG to detect connections dropping
authorTJ <hacker@iam.tj>
Sat, 6 Jun 2015 18:50:19 +0000 (19:50 +0100)
committerTJ <hacker@iam.tj>
Sat, 6 Jun 2015 18:50:19 +0000 (19:50 +0100)
src/uk/ac/ntu/n0521366/wsyd/client/ClientGUI.java
src/uk/ac/ntu/n0521366/wsyd/server/ServerSocial.java

index 39b8d52..5b32a73 100644 (file)
@@ -548,7 +548,9 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
 
                 NetworkStream serverSocial = _tcpStreamManager._tcpStreams.get(NetworkStreamManager.SERVERSOCIAL);
                 if (serverSocial != null) {
-                    // TODO: PING server
+                    MessagePresence mp = new MessagePresence("PING", new WSYD_SocketAddress(serverSocial.getLocalAddress(), WSYD_SocketAddress.Protocol.TCP));
+                    NetworkMessage nm = NetworkMessage.createNetworkMessage("Neighbour", null, mp);
+                    serverSocial.queueMessage(nm);
                 }
 
             }
@@ -793,6 +795,10 @@ public class ClientGUI extends javax.swing.JFrame implements NetworkMessageEvent
                                 logp(Level.CONFIG, "Switched to network logger");
                             }
                             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 bbdcdeb..92118fb 100644 (file)
@@ -531,6 +531,15 @@ 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;