Ich versuche zu ermitteln, ob ein Client eine Socket-Verbindung von Netty geschlossen hat. Gibt es eine Möglichkeit, dies zu tun?TCP Keep-Alive zu bestimmen, ob Client in netty
Antwort
In einem üblichen Fall, wo ein Client den Socket über close()
schließt und der TCP-Handshake geschlossen wurde erfolgreich beendet, wird ein channelInactive()
(oder channelClosed()
in 3) Ereignis ausgelöst.
In einem ungewöhnlichen Fall, in dem ein Client-Computer aufgrund eines Stromausfalls oder eines nicht angeschlossenen LAN-Kabels offline geht, kann es jedoch sehr lange dauern, bis Sie feststellen, dass die Verbindung tatsächlich unterbrochen wurde. Um diese Situation zu erkennen, müssen Sie regelmäßig eine Nachricht an den Client senden und erwarten, dass die Antwort innerhalb einer bestimmten Zeit erfolgt. Es ist wie ein Ping - Sie sollten in Ihrem Protokoll eine periodische Ping- und Pong-Nachricht definieren, die praktisch nur den Zustand der Verbindung überprüft.
Alternativ können Sie SO_KEEPALIVE
aktivieren, aber das Keepalive-Intervall dieser Option ist normalerweise vom Betriebssystem abhängig und ich würde es nicht empfehlen.
Um einem Benutzer zu helfen, diese Art von Verhalten relativ einfach zu implementieren, bietet Netty ReadTimeoutHandler
. Konfigurieren Sie Ihre Pipeline so, dass eine Ausnahme auslöst, wenn für eine bestimmte Zeit kein eingehender Datenverkehr vorhanden ist, und schließen Sie die Verbindung für die Ausnahme in Ihrer Handlermethode exceptionCaught()
. Wenn Sie die Partei sind, die eine periodische Ping-Nachricht senden soll, verwenden Sie einen Timer (oder IdleStateHandler
), um es zu senden.
Es hängt von Ihrem Protokoll ab, dass Sie ontop von netty verwenden. Wenn Sie es so entwerfen, dass es pingähnliche Nachrichten unterstützt, können Sie diese Nachrichten einfach senden. Abgesehen davon ist netty nur ein ziemlich dünner Wrapper um TCP.
Siehe auch this SO post, die isOpen()
und verwandte beschreibt. Dies löst jedoch das Keep-Alive-Problem nicht.
Wenn Sie einen Server schreiben und netty Ihr Client ist, kann Ihr Server eine Verbindung durch Aufrufen von select()
oder gleichwertig erkennen, um festzustellen, wann der Socket lesbar ist, und dann recv()
anrufen. Wenn recv()
0 zurückgibt, wurde der Socket ordnungsgemäß vom Client geschlossen. Wenn recv()
-1 zurückgibt, überprüfen Sie errno
oder einen gleichwertigen Wert für den tatsächlichen Fehler (mit einigen Ausnahmen sollten die meisten Fehler als ungeplante Trennung behandelt werden). Das Problem bei unerwarteten Verbindungsabbrüchen besteht darin, dass das Erkennen des Betriebssystems lange dauern kann. Sie müssten entweder TCP-Keep-Alives aktivieren oder den Client dazu zwingen, regelmäßig Daten an den Server zu senden. Wenn für eine gewisse Zeit nichts vom Client empfangen wird, nehmen Sie einfach an, dass der Client verschwunden ist und schließen Sie das Ende der Verbindung. Wenn der Client das möchte, kann er sich wieder verbinden.
Ich denke, Sie haben die Frage falsch gelesen. Er scheint Netty im Server zu benutzen. – EJP
Wenn Sie von einer Verbindung lesen, die vom Peer geschlossen wurde, erhalten Sie je nach API eine End-of-Stream-Meldung. Wenn Sie auf eine solche Verbindung schreiben, erhalten Sie eine IOException: 'Verbindung zurückgesetzt'. TCP bietet keine andere Möglichkeit, eine geschlossene Verbindung zu erkennen.
TCP keep-alive (a) ist standardmäßig deaktiviert und (b) wird standardmäßig nur alle zwei Stunden aktiviert, wenn es aktiviert ist. Das ist wahrscheinlich nicht das, was du willst. Wenn Sie es verwenden und Sie lesen oder schreiben, nachdem es festgestellt hat, dass die Verbindung unterbrochen ist, erhalten Sie den Fehler zurücksetzen,
Unter Windows 2000 und höher können Sie das gewünschte Intervall des TCP Keep-Alive pro Verbindung mit 'WSAIoctl (SIO_KEEPALIVE_VALS)' programmierbar einstellen. –
- 1. netty tcp bytebuffer server und client
- 2. Ermitteln, ob bestehende Verbindungen TCP KeepAlive unter Windows verwenden
- 3. Nginx TCP (WebSockets) Timeout/Keepalive Config
- 4. Netty 4 mehrere Client
- 5. netty - Timeouts auf TCP-Server konfigurieren
- 6. Netty Client to Server Nachricht
- 7. Wie Netty Server mit langsamen Client Drossel?
- 8. Wie Netty Client gesamte Antwort lesen
- 9. Channel.messageReceived-Ereignis in Netty
- 10. TCP "Client" Beispiel in Clojure!
- 11. Client-Server TCP-Kommunikation
- 12. TCP Client-Server-Problem
- 13. iOS tcp Client Verzögerung
- 14. TCP-Client Asynchroner Socket-Rückruf
- 15. Java TCP Server/Client in Android Studio
- 16. Warum NodeJS KeepAlive scheint nicht wie erwartet zu funktionieren?
- 17. Minimal Netty Jar für Applet-Client
- 18. Wie Netty für Chatraum zu verwenden. flash client
- 19. Wie zu bestimmen, ob GraphicsEnvironment vorhanden ist
- 20. Was ist die Praxis zu senden "keepalive packet"
- 21. Channel.isWritable notification in Netty
- 22. Fallanweisung zu bestimmen, ob ich Union
- 23. wie zu bestimmen, ob Webseite geändert wurde
- 24. Wie zu bestimmen, ob ServletRequest PreflightRequest ist?
- 25. Objective-c TCP/IP-Client
- 26. TCP-Server und Client-Interaktion
- 27. tcp client mit socket.io (nodejs)
- 28. Multithread-TCP-Server und Client
- 29. TCP-Server/Client mit Timeout
- 30. ein TCP-Client in golang Erstellen
Die Antworten in diesem Link sind meistens falsch. Es gibt viel bessere Antworten in SO. – EJP
@EJP Haben Sie einen Link? Wenn Sie eine Bearbeitung vorschlagen könnten, werde ich das gerne annehmen! –
Mein Verständnis ist, dass TCP Keep-Alive eingebaut hat. Ist es nicht möglich, dies zu nutzen? –