Wenn ich eine Selector
habe, die sockets
annimmt und sie in eine Warteschlange für andere Threads verschiebt, und keine Threads brauchen einen Socket für, sagen wir zwei Minuten, und der Client schiebt Daten aber dann Timeout und trennt die Verbindung. Wenn ein thread
dann einen dieser jetzt geschlossenen sockets
nimmt und versucht, von ihm zu lesen, wird es die Daten erhalten, die bereits vom Client gesendet wurden, oder wird dort nichts zu lesen sein?Sind Bytes auf einer TCP-Socket-Verbindung verloren, wenn die Verbindung getrennt wird, bevor die Bytes gelesen werden?
Antwort
Es hängt davon ab, was 'getrennt' bedeutet.
- Wenn Sie die Steckdose selbst geschlossen, werden Sie
SocketException: socket closed
aus den verschiedenenread()
Methoden erhalten. - Wenn die Verbindung normalerweise vom Peer geschlossen wurde, werden alle ausstehenden Daten gelesen, bevor das Ende des Streams signalisiert wird.
- Wenn die Verbindung abgebrochen wurde, gehen alle ausstehenden Daten verloren.
OK danke, ich denke, das zweite ist was ich auf meinem Server sehe. Kannst du klären was "abortiv zurückgesetzt" bedeutet? –
Es gibt verschiedene Umstände, unter denen eine Verbindung zurückgesetzt statt schön geschlossen wird: Prozess beendet ohne Schließen (Windows); Der Prozess schließt den Socket, solange noch ungelesene Daten im Socket-Lesepuffer vorhanden sind. Host empfängt Daten für eine Verbindung, die bereits am Ende geschlossen ist ... Alle diese verursachen die Ausgabe eines TCP RST. – EJP
Sie können nicht von einer geschlossenen Steckdose lesen. – Berger