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:
Wie sollte ein Client einen Socket schließen, damit er nicht als Fehler auf dem Server betrachtet wird?
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.