[技术总结] 郁闷了几天的NIO开发问题,终于解决了

Resource:: 

http://forum.java.sun.com/thread.jspa?forumID=4&messageID=1817105&threadID=412377  NIO SocketChannel non-blocking read
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4469394  (so) SocketChannels registered with OP_WRITE only release selector once (win)  ?实际上这个BUG只存在于 1.4.0beta以前的jvm中.

查看java的版本. java -version

GoogleKeyWord :
   1. selector nio 返回 
        http://www.matrix.org.cn/resource/article/0/437.html  为高速网络使用select
       
http://feidao.cnblogs.com/archive/2005/07/15/193788.html 同时遇到了很多地方都转载 ccidnet的一片技术文章, 却都是那么残缺不全.   
      selector nio 不返回,多了一个字,结果什么都没有搜出来.  
      bincompile vs bincompiler 差别就更大了.真的是一个都不能少.
   2. selectedkey .attachment
  还行,搜出了上面几个相关的连接. 真是详细. 对比了一下,发现自己犯了几个错误. 
      a)  new Server之后,没有调用注册.          

   public NioSocket createSocket(NioWorker worker, SocketChannel sc) throws IOException {
               SocketClient result = new SocketClient(sc);
               result.registerDecoder(new SocketDecoder());
               result.register(worker); //这行没有加,其实也不是没写,而是在copy的过程中,覆盖没了///
               AddClient(result);
               //
               sc.configureBlocking(false);
               SelectionKey k = sc.register(worker.s, SelectionKey.OP_READ );
               k.attach(result);    

  }

   b) 没有仔细的查看错误原因,解决问题的方法肯定是要对比正确的方式,这一点也是受到了 jniosocket的迷惑,因为它的那个sample是 Httpserver,所以不存在保持连接的问题, 所以httpserver可以工作,但是用做socket就不行了. 还有一个不同就是因为使用了 Java NIO, 因为传说它的性能是很棒的. 所以他的工作方式和以前的还是不一样的.

   public NioSocket createSocket(NioWorker worker, SocketChannel sc) throws IOException {
               SocketClient result = new SocketClient(sc);
               result.registerDecoder(new SocketDecoder());
               result.register(worker); //这行没有加,其实也不是没写,而是在copy的过程中,覆盖没了///
               AddClient(result);
               //
               sc.configureBlocking(false);
               SelectionKey k = sc.register(worker.s, SelectionKey.OP_READ );
               k.attach(result);    

  }

   b) 没有仔细的查看错误原因,解决问题的方法肯定是要对比正确的方式,这一点也是受到了 jniosocket的迷惑,因为它的那个sample是 Httpserver,所以不存在保持连接的问题, 所以httpserver可以工作,但是用做socket就不行了. 还有一个不同就是因为使用了 Java NIO, 因为传说它的性能是很棒的. 所以他的工作方式和以前的还是不一样的.

下面给大家一个范例的连接,很好的演示了 NIO Socket 服务器和客户端的工作..
 select I/O模型是基于事件驱动(event-drivern)的。所有输入源被注册到一个Selector对象上,它等待着任何输入源的活动。这个模型不同于流模型,但它仍是一个实体模型。很大程度上,可以说select模型运行在流模型之上。从硬件角度来讲,I/O是基于事件驱动的,因为像网卡、键盘和磁盘等外设在发送数据前都不会发出通知。
流模型用缓冲掩盖了阻塞式I/O调用之后的事件驱动I/O的复杂性使得程序变得更简单。但当你需要更高的速度时,你需要越过流这一层直接使用I/O事件本身。NIO库提供了非常优雅的基于缓冲的接口连接到Select模型。同时它也完全适合旧的流模型;

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]

click to change验证码

无觅相关文章插件