xml地图|网站地图|网站标签 [设为首页] [加入收藏]
[转]Java NIO原理图文分析及代码实现
分类:网络频道

宝马娱乐在线网址,Mina 组件介绍之 IoAcceptor 与 IoConnector,

  在网络通信中,Socket通信的双方分为服务端与客户端,在Java NIO 的实现中采用Socket/ServerSocket, SocketChannel/ServerSocketChannel分别表示客户端与服务端对象及程序与所操作的Socket间的连接通道。

  在Mina框架中采用IoAcceptor来表示接受连接的服务端,而用IoConnector表示客户端。这里我认为IoAccepto/IoConnector更像是SocketChannel/ServerSocketChannel的进一步抽象,表示的是应用程序 与 Socket间的连接通道。

  首先看IoAcceptor的类图关系,这里只关心Socket相关的部分:

 

  可见IoAcceptor和IoConnector都继承自IoService,IoConnector的实现与IoAcceptor类似,图中未给出。在实际的Socket通信编程中,最终应用的类是SocketAcceptor。事实上Mina对NIO的实现更多的体现在AbstractPollingIoAcceptor(以及对应的AbstractPollingIoConnector)中,在其中定义了内部类Acceptor来实现对到达连接的轮询处理。内部类Acceptor实现了接口Runnable, AbstractIoService本身持有Executor,Acceptor执行的轮询任务交由Executor处理。

  值得注意的是此处的Executor可以由程序开发者指定具体的类型,在未指定的情况下,其默认的实现是CachedThreadPool。事实上对于IoAcceptor来说,每个Acceptor对应的Socket为一个,对到达连接的轮询处理已交由Acceptor线程处理,此处仍旧定义了线程池似乎多此一举。

  对于到达的连接则交由AbstractPollingIoAcceptor其本身持有的processor处理。在未明确指定的情况下其本身的processor是SimpleIoProcessorPool类型,关于processor是另外一个话题。

  由此可以看到,IoAcceptor本身占用一个线程完成对到达连接的接收处理,后续连接建立后会话中通信的处理则交由Processor负责。

 

http://www.bkjia.com/Javabc/1306296.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1306296.htmlTechArticleMina 组件介绍之 IoAcceptor 与 IoConnector, 在网络通信中,Socket通信的双方分为服务端与客户端,在Java NIO 的实现中采用Socket/ServerSocket, Socket...

本文转自:http://weixiaolu.iteye.com/blog/1479656

前言:
最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。可以参考:http://baike.baidu.com/view/32726.htm)机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://weixiaolu.iteye.com/blog/1477774)和java NIO。为了能够正确地分析hadoop的RPC源码,我觉得很有必要先研究一下java NIO的原理和具体实现。
这篇博客我主要从两个方向来分析java NIO
目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现
具体分析:
一.java NIO 和阻塞I/O的区别
1. 阻塞I/O通信模型
假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超时)才会返回;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。阻塞I/O的通信模型示意图如下:

 

宝马娱乐在线网址 1

 

如果你细细分析,一定会发现阻塞I/O存在一些缺点。根据阻塞I/O通信模型,我总结了它的两点缺点: 1. 当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU时间

  1. 阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。
    在这种情况下非阻塞式I/O就有了它的应用前景。
    2. java NIO原理及通信模型
    Java NIO是在jdk1.4开始使用的,它既可以说成“新I/O”,也可以说成非阻塞式I/O。下面是java NIO的工作原理:
  2. 由一个专门的线程来处理所有的 IO 事件,并负责分发。 2. 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 3. 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。
    阅读过一些资料之后,下面贴出我理解的java NIO的工作原理图:

 

宝马娱乐在线网址 2

 

(注:每个线程的处理流程大概都是读取数据、解码、计算处理、编码、发送响应。)
Java NIO的服务端只需启动一个专门的线程来处理所有的 IO 事件,这种通信模型是怎么实现的呢?呵呵,我们一起来探究它的奥秘吧。java NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream),在通道上可以注册我们感兴趣的事件。一共有以下四种事件:

 

事件名 对应值
服务端接收客户端连接事件 SelectionKey.OP_ACCEPT(16)
客户端连接服务端事件 SelectionKey.OP_CONNECT(8)
读事件 SelectionKey.OP_READ(1)
写事件 SelectionKey.OP_WRITE(4)

 

   
   
   
   
   

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。下面是我理解的java NIO的通信模型示意图:

 

宝马娱乐在线网址 3

本文由宝马娱乐在线发布于网络频道,转载请注明出处:[转]Java NIO原理图文分析及代码实现

上一篇:smarty截取字符串truncate函数介绍宝马娱乐在线 下一篇:宝马娱乐在线网址:Linux环境变量LD_LIBRARY_PATH
猜你喜欢
热门排行
精彩图文