使用AsynchronousServerSocketChannel实现侦听器。我打开channnel,绑定到端口并开始接受连接。我能够听取和阅读消息。关闭通道之后的问题事件我的听众仍在接受数据。
我关闭服务器通道套接字连接,如下所示。
this.serverChannel.close();
this.serverChannel = null;
这是接受连接的完成处理程序
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);
}
我觉得AsynchronousSocketChannel比accept方法打开的还没有关闭。因此,我在关闭AsynchronousServerSocketChannel之后收到了消息事件。
在关闭serversocketchannel时是否有关闭AsynchronousSocketChannel的方法。请让我知道最好的是完全停止AsynchronousServerSocketChannel并且它协助AsynchronousSocketChannel
答案 0 :(得分:1)
AsynchronousServerSocketChannel未关闭已建立的连接
我同意。它没有。这并不意味着这样做。没有理由关闭服务器套接字通道应该关闭其他任何东西。
如果您希望关闭接受的套接字,则必须自行关闭它们,而您不是。关闭发生或应该发生在logReadFailureAndClose()
,您尚未发布。关闭服务器套接字通道与它无关。如果要同时关闭所有内容,则需要一个已接收套接字的最新列表,并在关闭服务器套接字通道时将它们全部关闭。