java.net.Socket-TCP keep-alive-Nutzung
Wie zu verwenden java.net.Socket
setKeepAlive(boolean b)
API?
Ich bin hosting eine einfache server mit Socket
.
Die clients können eine Verbindung herstellen und Daten senden. Ich werde nicht die Verbindung schließen, es sei denn, der client sendet das Ende des Stroms. Der client kann weiterhin zu halten eine Verbindung für längere Zeit. Die Datenübertragung Los ist, aber plötzlich sehe ich, dass es einen Zusammenhang gibt Verlust ohne irgendwelche logs zu löschen. Sobald der client neu gestartet wird (nicht server), die übertragung beginnt wieder.
Ich bin nicht der Festsetzung timeout
wie es standardmäßig ist die Unendlichkeit. Ich möchte verstehen, was setKeepAlive
tatsächlich so, dass ich in der Lage zu entscheiden, ob ich brauche, um das zu true
.
Kann mir jemand helfen zu verstehen, die gleichen? danke.
- Vielleicht könnte Sie klären, was genau das problem ist? Und vielleicht poste den code, der bewirkt, dass Sie Schwierigkeiten.
- Wenn Sie nicht verstehen, was
setKeepAlive()
hat, dann Woher wissen Sie, dass es Ihr problem löst? - Hallo , ich bearbeitet habe, meine Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Dokumentation für
setKeepAlive()
sagt, es wird zu aktivieren (oder deaktivieren)SO_KEEPALIVE
option auf den sockel.Hier ist eine weitere Referenz zu erklären, die
SO_KEEPALIVE
option.Beachten Sie, dass in der Vernetzung, verbindungen verloren gehen können, jederzeit für eine Vielzahl von Gründen. Wenn die Verbindung durchläuft ein NAT-router, der Eintrag in der NAT-Tabelle Auslaufen könnte (wenn die Verbindung inaktiv ist) und die Verbindung geht verloren durch, dass. Der client könnte aufhören zu funktionieren, oder ausgesetzt werden (insbesondere laptops und mobile Geräte), oder ein Kabel könnte abgetrennt werden, oder über WLAN (oder Mobilfunk) signal könnte gestört werden, oder ... die Liste kann weiter gehen. Ihr server muss geschrieben werden, zu bewältigen elegant, mit Verlust der Verbindung.
Ich vor dem ähnlichen problem in meinem Fall
In JAVA-Socket – TCP-verbindungen verwaltet werden, auf OS-Ebene,
java.net.Steckdose liefert keine eingebaute Funktion zum einstellen der timeouts für die keepalive-Pakets auf einer pro-socket-Ebene.
Aber können wir damit die keepalive-option für die java-socket-aber es dauert 2 Stunden 11 Minuten (7200 Sek) per default um zu verarbeiten, nachdem eine veraltete tcp-verbindungen.
Diese Ursache-Verbindung verfügbar für sehr lange Zeit vor den purge.
So fanden wir eine Lösung zur Verwendung von Java Native Interface (JNI), dass call-native code(c++) um diese Optionen zu konfigurieren.
****Windows-Betriebssystem****
In windows-Betriebssystem keepalive_time & keepalive_intvl kann konfigurierbar sein, aber von "tcp_keepalive_probes" nicht change.By standardmäßig, wenn ein TCP-socket wird initialisiert, setzt das keep-alive timeout auf 2 Stunden und die keep-alive-Intervall auf 1 Sekunde. Die Standard-system-Breite-Wert des keep-alive-timeout ist kontrollierbar durch die KeepAliveTime registry-Einstellung, die einen Wert in Millisekunden.
Unter Windows Vista und höher, die Anzahl der keep-alive Sonden (Daten-Neuübertragungen) ist auf 10 festgelegt und kann nicht geändert werden.
Unter Windows Server 2003, Windows XP und Windows 2000 die Standardeinstellung für die Anzahl der keep-alive Sonden ist 5. Die Anzahl der keep-alive Sonden ist kontrollierbar.
Für windows-Winsock-IOCTLs-Bibliothek wird verwendet zum konfigurieren der tcp-keepalive-Parameter.
int WSAIoctl(
SocketFD, //descriptor-Identifizierung a-Buchse
SIO_KEEPALIVE_VALS, //dwIoControlCode
(LPVOID) lpvInBuffer, //Zeiger auf struct tcp_keepalive
(DWORD) cbInBuffer, //Länge des eingabepuffers
NULL, //Puffer für die Ausgabe
0, //Größe des Ausgabe-Puffers
(LPDWORD) lpcbBytesReturned, //Anzahl der bytes zurückgegeben
NULL, //OVERLAPPED-Struktur
NULL //completion-routine
);
Linux OS
Linux hat eine eingebaute Unterstützung für keepalive-die müssen aktivieren des TCP/IP-networking, um es zu benutzen. Programme anfordern müssen keepalive-Kontrolle für Ihre Steckdosen mit der setsockopt-Schnittstelle.
int setsockopt(int socket, int level, int optname,
const void *optval, socklen_t optlen)
Jedem client-socket wird erstellt mit Hilfe von java.net.Socket. Datei-Deskriptor-ID, die für jeden socket abgerufen werden mit Hilfe der java reflection.