You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2011/04/13 17:19:54 UTC

svn commit: r1091816 - in /mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp: NioSelectorProcessor.java NioSocketSession.java

Author: jvermillard
Date: Wed Apr 13 15:19:54 2011
New Revision: 1091816

URL: http://svn.apache.org/viewvc?rev=1091816&view=rev
Log:
removing session closed by the remote end

Modified:
    mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
    mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSocketSession.java

Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java?rev=1091816&r1=1091815&r2=1091816&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java Wed Apr 13 15:19:54 2011
@@ -22,6 +22,7 @@ package org.apache.mina.transport.tcp;
 
 import java.io.IOException;
 import java.net.SocketAddress;
+import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.ServerSocketChannel;
@@ -59,12 +60,7 @@ public class NioSelectorProcessor implem
 
     private Map<SocketAddress, ServerSocketChannel> serverSocketChannels = new ConcurrentHashMap<SocketAddress, ServerSocketChannel>();
 
-    public NioSelectorProcessor(String name, SelectorStrategy strategy) {
-        this.strategy = strategy;
-        this.log = LoggerFactory.getLogger("SelectorProcessor[" + name + "]");
-    }
-
-    private Selector selector;
+    private ByteBuffer readBuffer;
 
     // new binded server to add to the selector
     // {ServerSocketChannel, IoServer}
@@ -79,6 +75,16 @@ public class NioSelectorProcessor implem
     // session to be removed of the selector
     private final Queue<NioSocketSession> sessionsToClose = new ConcurrentLinkedQueue<NioSocketSession>();
 
+    private Selector selector;
+
+    public NioSelectorProcessor(String name, SelectorStrategy strategy) {
+        this.strategy = strategy;
+        this.log = LoggerFactory.getLogger("SelectorProcessor[" + name + "]");
+
+        // TODO : configurable parameter
+        readBuffer = ByteBuffer.allocate(1024);
+    }
+
     /**
      * Add a bound server channel for starting accepting new client connections.
      * 
@@ -155,6 +161,9 @@ public class NioSelectorProcessor implem
         // map for finding the keys associated with a given server
         private Map<ServerSocketChannel, SelectionKey> serverKey = new HashMap<ServerSocketChannel, SelectionKey>();
 
+        // map for fining keys associated with a given session
+        private Map<NioSocketSession, SelectionKey> sessionKey = new HashMap<NioSocketSession, SelectionKey>();
+
         @Override
         public void run() {
             if (selector == null) {
@@ -197,9 +206,25 @@ public class NioSelectorProcessor implem
                     if (sessionsToConnect.size() > 0) {
                         while (!sessionsToConnect.isEmpty()) {
                             NioSocketSession session = sessionsToConnect.poll();
-                            session.getSocketChannel().register(selector, SelectionKey.OP_READ);
+                            SelectionKey key = session.getSocketChannel().register(selector, SelectionKey.OP_READ);
+                            key.attach(session);
+                            sessionKey.put(session, key);
                         }
                     }
+
+                    // pop session for close
+                    if (sessionsToClose.size() > 0) {
+                        while (!sessionsToClose.isEmpty()) {
+                            NioSocketSession session = sessionsToClose.poll();
+
+                            SelectionKey key = sessionKey.remove(session);
+                            key.cancel();
+
+                            // needed ?
+                            session.getSocketChannel().close();
+                        }
+                    }
+
                     log.debug("selecting...");
                     int readyCount = selector.select(SELECT_TIMEOUT);
                     log.debug("... done selecting : {}", readyCount);
@@ -220,7 +245,21 @@ public class NioSelectorProcessor implem
 
                             if (key.isReadable()) {
                                 log.debug("readable client {}", key);
-                                // TODO
+                                NioSocketSession session = (NioSocketSession) key.attachment();
+                                SocketChannel channel = session.getSocketChannel();
+                                int readCount = channel.read(readBuffer);
+                                log.debug("read {} bytes", readCount);
+                                if (readCount < 0) {
+                                    // session closed by the remote peer
+                                    log.debug("session closed by the remote peer");
+                                    sessionsToClose.add(session);
+                                } else {
+                                    // we have read some data
+                                    // TODO : push to the chain
+
+                                    readBuffer.rewind();
+                                }
+
                             }
 
                             if (key.isAcceptable()) {

Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSocketSession.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSocketSession.java?rev=1091816&r1=1091815&r2=1091816&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSocketSession.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSocketSession.java Wed Apr 13 15:19:54 2011
@@ -141,4 +141,5 @@ public class NioSocketSession extends Ab
         // TODO Auto-generated method stub
         return null;
     }
+    
 }
\ No newline at end of file