Lassen Sie einen Listener mithilfe von AsynchronousServerSocketChannel implementieren. Ich öffne den Kanal, binde an den Port und nehme Verbindungen an. Ich kann die Nachrichten hören und lesen. Das Problem Ereignis nach dem Schließen des Kanals mein Hörer noch Daten akzeptieren.AsynchronousServerSocketChannel schließt die eingerichteten Verbindungen nicht
Ich schließe die Server-Kanal-Socket-Verbindung wie folgt.
this.serverChannel.close();
this.serverChannel = null;
Hier ist der Handler Abschluss Verbindungen fühlen
this.serverChannel
.accept(null,
new java.nio.channels.CompletionHandler<AsynchronousSocketChannel, Void>() {
@Override
public void completed(
AsynchronousSocketChannel result,
Void attachment) {
acceptConnections();
read(new HSLParsingContext(), result);
}
@Override
public void failed(Throwable exc, Void attachment) {
if (!(exc instanceof AsynchronousCloseException))
});
public void read(final HSLParsingContext context,
final AsynchronousSocketChannel channel) {
try {
channel.read(context.buffer, null,
new java.nio.channels.CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer bytesRead, Void attachment) {
try {
HSLSysLogTcpListener.this.logger.infoFmt(
"Bytes received: %s ", bytesRead);
if (bytesRead > 0) {
messageHandler(context, false);
}
if (bytesRead == -1) {
// when nothing is there to read in the
// channel make sure there
// is nothing in the content buffer before
// closing the channel
if (context.content.length() > 0) {
messageHandler(context, true);
}
throw new EOFException();
}
// keep reading data asynchronously
read(context, channel);
} catch (Exception e) {
failed(e, null);
}
}
@Override
public void failed(Throwable e, Void attachment) {
logReadFailureAndClose(channel, e);
}
});
} catch (Throwable e) {
logReadFailureAndClose(channel, e);
}
ich irgendwie zu akzeptieren, dass die AsynchronousSocketChannel als durch die akzeptieren Methode geöffnet wird nicht geschlossen. Daher empfange ich das Nachrichtenereignis nach dem Schließen des AsynchronousServerSocketChannel.
Gibt es als Weg AsynchronousSocketChannel beim Schließen der serversocketchannel.Please lassen Sie mich wissen, der beste vollständig die AsynchronousServerSocketChannel zu stoppen war und es asscoiated AsynchronousSocketChannel
Ich schließe in logReadFailureAndClose(). Dies geschieht, wenn ich bytesRead == -1 (Ende des Streams) erreicht wird oder einige Zeit, dass ich die Verbindung durch Peer zurückgesetzt bekomme, und es zwingt den Socket-Kanal, geschlossen zu werden. Aber es gibt Zeiten, in denen keines dieser Ereignisse auftritt und die Benutzer den Hörer abbrechen wollen. Zu dieser Zeit schließe ich einfach AsynchronousServerSocketChannel. Wie bekomme ich die Liste von AsynchronousSocketChannel, die noch nicht geschlossen sind. Ist das ein eindeutiges ID-Attribut für jeden AsynchronousSocketChannel? –
Ich habe auch über das Hinzufügen von AsynchronousChannelGroup zu AsynchronousServerSocketChannel und das Aufrufen von Shutdown für die Gruppe gelesen. Wird es funktionieren? –
@KarthikeyanRamasamy Nein, das ist nur eine Thread-Fabrik wirklich. Sie müssen tun, was ich in meiner Antwort gesagt habe: Halten Sie eine Sammlung von akzeptierten Sockets und schließen Sie alle selbst. – EJP