2016-03-23 11 views
0

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

Antwort

1

AsynchronousServerSocketChannel schließt nicht die etablierten Verbindungen

ich zu schließen zustimmen. Es tut es nicht. Es ist nicht dazu gedacht. Es gibt keinen Grund, warum das Schließen des Server-Socket-Kanals irgendetwas anderes schließen sollte.

Wenn Sie möchten, dass akzeptiert Sockets geschlossen werden, müssen Sie sie selbst schließen, und Sie sind nicht. Das Schließen geschieht, oder sollte passieren, in logReadFailureAndClose(), die Sie nicht veröffentlicht haben. Das Schließen des Server-Socket-Kanals hat damit nichts zu tun. Wenn Sie alles gleichzeitig schließen möchten, benötigen Sie eine aktuelle Liste der akzeptierten Sockets und schließen sie alle, wenn Sie den Server-Socket-Kanal schließen.

+0

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? –

+0

Ich habe auch über das Hinzufügen von AsynchronousChannelGroup zu AsynchronousServerSocketChannel und das Aufrufen von Shutdown für die Gruppe gelesen. Wird es funktionieren? –

+0

@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