AsynchronousServerSocketChannel未关闭已建立的连接

时间:2016-03-23 02:33:05

标签: java nio

使用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

1 个答案:

答案 0 :(得分:1)

  

AsynchronousServerSocketChannel未关闭已建立的连接

我同意。它没有。这并不意味着这样做。没有理由关闭服务器套接字通道应该关闭其他任何东西。

如果您希望关闭接受的套接字,则必须自行关闭它们,而您不是。关闭发生或应该发生在logReadFailureAndClose(),您尚未发布。关闭服务器套接字通道与它无关。如果要同时关闭所有内容,则需要一个已接收套接字的最新列表,并在关闭服务器套接字通道时将它们全部关闭。