Wie schließt man einen AsynchronousSocketChannel sauber?

8

Mein Server verwendet eine AsynchronousServerSocketChannel , die Clientverbindungen mit einem CompletionHandler abhört. Wenn eine Clientverbindung akzeptiert wird, wird AsynchronousSocketChannel gelesen, wobei wiederum ein CompletionHandler verwendet wird, um die Daten ohne Zeitüberschreitung zu empfangen.

So weit, so gut, mein Client verbindet, schreibt Daten, die vom Server gelesen werden, der in der Lage ist, die Daten über denselben Socket zurück an den Client zu senden.

Wenn mein Client beendet wird, ruft er AsynchronousSocketChannel.close() auf, um den Socket zu schließen. Wenn dieser Aufruf erfolgt, wartet der Server darauf, Daten aus dem Socket zu lesen.

Ich hatte erwartet, dass der Aufruf von AsynchronousSocketChannel.close() auf dem Client in einen Callback zu CompletionHandler.completed mit einer Leselänge von -1 auf dem Server übersetzt werden würde. Dies bedeutet, dass der Socket geschlossen wurde, der Callback jedoch auf CompletionHandler.failed mit folgender Ausnahme:

%Vor%

Wie sollte ein Client einen Socket schließen, damit er nicht als Fehler auf dem Server betrachtet wird?

    
Nick Holt 23.12.2013, 15:04
quelle

1 Antwort

1

Die Dokumentation zum Schließen sagt, dass es verursacht AsynchronousCloseException oder ClosedChannelException auf der anderen Seite.

Um completed(-1) zu verursachen, sollte der Client shutdownInput .

Ich würde jedoch AsynchronousCloseException und ClosedChannelException als normales Herunterfahren zusammen mit completed (-1) behandeln.

    
Alexei Kaigorodov 23.12.2013, 19:05
quelle

Tags und Links