2016-04-28 12 views
0

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?

+3

Sie können nicht von einer geschlossenen Steckdose lesen. – Berger

Antwort

1

Es hängt davon ab, was 'getrennt' bedeutet.

  • Wenn Sie die Steckdose selbst geschlossen, werden Sie SocketException: socket closed aus den verschiedenen read() 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.
+0

OK danke, ich denke, das zweite ist was ich auf meinem Server sehe. Kannst du klären was "abortiv zurückgesetzt" bedeutet? –

+1

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