Ich baue eine Client-Server-Anwendung, wo ich einen Keepalive-Mechanismus implementieren muss, um festzustellen, ob der Client abgestürzt ist oder nicht. Ich habe getrennte Threads auf Client- und Server-Seite. der Client-Thread sendet ein "Ping" dann schläft für 3 Sekunden, während der Server liest die BufferedInputStream
und überprüft, ob Ping empfangen wird, wenn ja, macht der Ping-Zähler gleich Null, sonst erhöht es den Zähler um +1, der Server-Thread dann schläft für 3 Sekunden, wenn der Ping-Zähler 3 erreicht, deklariert er den Client als tot.Implementieren von Keepalives mit Java
Das Problem ist, dass, wenn der Server den Eingabestream liest, ein blockierender Aufruf, und es blockiert, bis der nächste Ping empfangen wird, unabhängig davon, wie verzögert es ist, so dass der Server nie einen verpassten Ping erkennt.
Vorschläge, damit ich den aktuellen Wert des Streams lesen kann und nicht blockiert, wenn der eingehende Stream nichts enthält.
Danke,
Können Sie bitte erklären "Server erkennt nie einen verpassten Ping"? –
Sagen Sie zum Beispiel, dass der Client Keep-Alives alle 3 Sekunden sendet und der Server alle 3 Sekunden auch nach Keep-Alives sucht. Nun sagen Sie, der Client sendet keine Keep-Alive für 10 Sekunden, dann, wenn der Server nach dem Keep-Alive sucht, wird es nichts lesen, weil der Client nichts gesendet hat, so dass der Aufruf zum Lesen von Stream blockiert wird, bis es erhält das nächste Keepalive 10 Sekunden später, an dem der Server gerne erklärt, dass er ein Keepalive erhalten hat. So wird es niemals einen verlorenen Keep-Alive entdecken. – comatose