2016-03-23 4 views
0

Имейте прослушиватель, реализованный с использованием AsynchronousServerSocketChannel. Я открываю канал, привязываюсь к порту и начинаю принимать соединения. Я могу слушать и читать сообщения. Событие проблемы после закрытия канала мой слушатель все еще принимает данные.AsynchronousServerSocketChannel не закрывает установленные соединения

Я закрываю подключение к серверному каналу, как показано ниже.

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 чем открыл метод принимает не закрыт. Следовательно, я получаю сообщение сообщения после закрытия AsynchronousServerSocketChannel.

Есть как способ закрыть AsynchronousSocketChannel при закрытии serversocketchannel.Please дайте мне знать лучше полностью остановить AsynchronousServerSocketChannel и asscoiated AsynchronousSocketChannel

ответ

1

AsynchronousServerSocketChannel не загораживая установленных соединений

I дать согласие. Это не так. Он не предназначен для этого. Нет причин, по которым закрытие канала сокетов сервера должно закрыть что-нибудь еще.

Если вы хотите, чтобы принимали розетки, которые должны быть закрыты, вы должны закрыть их самостоятельно, а вы нет. Закрытие происходит, или должно произойти, в logReadFailureAndClose(), которое вы не разместили. Закрытие канала сокета сервера не имеет к этому никакого отношения. Если вы хотите закрыть все одновременно, вам понадобится обновленный список принятых сокетов и закройте их все, когда вы закроете канал сокета сервера.

+0

i do close in logReadFailureAndClose(). Это произойдет, будет достигнуто i bytesRead == -1 (конец потока) или некоторое время, когда я получаю сброс соединения с помощью сверстника, и он заставляет закрывать chanel. Но бывают случаи, когда ни одно из этих событий не происходит, а использование хочет отменить прослушиватель. В то время я просто закрываю AsynchronousServerSocketChannel. Как я могу получить список AsynchronousSocketChannel, которые еще не закрыты. Является ли это уникальным атрибутом id для каждого AsynchronousSocketChannel ?? –

+0

Также я прочитал о добавлении AsynchronousChannelGroup в AsynchronousServerSocketChannel и вызове shutdown в группе. Будет ли это работать? –

+0

@ KarthikeyanRamasamy Нет, это просто фабрика нитей. Вы должны сделать то, что я сказал в своем ответе: сохранить коллекцию принятых сокетов и закрыть их всех самостоятельно. – EJP