当前位置:  编程技术>java/j2ee

java nio基础使用示例

    来源: 互联网  发布时间:2014-10-29

    本文导语:  在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入。归纳为:1、java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字...

在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。
传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入。
归纳为:
1、java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了。
2、在1的基础上改进为,开设线程,serversocker.accept()后让线程去等待,但是当并发量高的时候,相当耗费资源的。
3、java nio为非阻塞,采用的是reactor反应堆模式,或者说observer观察者模式,监察io端口,注册事件到selector,当事件满足条件后触发行为。
大致流程为:
java nio提供一个selector,这个类似一个观察者,将需要探知的socketchannel注册到selector上
接着我们做别的事情,当有事件发生时候,selector会通知我们,传回一组selectionKey,我们读取这些key就会获得到我们刚刚注册过的socketchannel,然后从这个channel读取数据、处理业务逻辑。
selector内部原理,采用轮询的方式,对所注册的channel进行遍历,判断channel所注册的事件是否发生。
代码举例为:

代码如下:

// 1.创建一个selector对象
Selector selector = Selector.open();
// 2.建立channel对象,并绑定在8080端口上
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),8080);
ssc.socket().bind(address);
// 3.将channel设定为非阻塞方式
ssc.configureBlocking(false);
// 向selector注册channel以及我们感兴趣的事件
SelectionKey skey = ssc.register(selector,SelectionKey.OP_ACCEPT);// 这边注册了accept,服务器接受到client连接事件
// 4、简单模拟下轮询过程
while(true)
{
  // selector通过select方法,通知我们感兴趣的事件发生了
  int nKeys = selector.select();
  // 当nKeys>0表示事件发生了
  // 这时候可以通过selector.selectedKeys();方法拿到key集合
  Set selectKeys = selector.selectedKeys();
  // 5、迭代遍历keys对象,分别做适配业务逻辑处理
  // 比如:
  s = (SelectionKey)(selectKeys.iterator()).next();
  if(s.isAcceptable())// 判断为注册的OP_ACCEPT事件
  {
    // 从channel中获取我们刚才注册的channel
    Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
    SocketChannel sc = socket.getChannel();
    // 设置为非阻塞
    sc.configureBlocking(false);
  // 注册read/write事件
    sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
  }
}
// 上边就是简单的java nio演示的伪代码
// 这时候,client端可以telnet 主机名 端口号 连接到server服务器。

    
 
 

您可能感兴趣的文章:

  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • java Servlet实现Session创建存取以及url重写代码示例
  • java 四舍五入使java保留2位小数示例讲解
  • java进行error捕获和处理示例(java异常捕获)
  • java去除集合中重复元素示例分享 java去除重复
  • java读取csv文件示例分享(java解析csv文件)
  • java求三个数的最大值的示例分享
  • java生成字母数字组合的随机数示例 java生成随机数
  • java实现网页解析示例
  • java协变返回类型使用示例
  • 使用java执行定时任务示例
  • java自定义枚举转换器示例
  • java向文件末尾添加内容示例分享
  • java正则表达式获取url的host示例
  • java使用正则表达校验手机号码示例(手机号码正则)
  • java实现jframe透明窗体示例
  • java的split方法使用示例
  • java抓取网页数据示例
  • Oracle 使用Java Source 简单示例
  • java自定义日期转化类示例
  • 请问大侠学java要有c语言基础吗?
  • 请问,要有哪些java基础才能开始学习EJB???谢谢!!!(急!!!)
  • 假设现在对且仅对java基础比较熟悉(通过scjp),要做一个java proxy的软件,步聚是什么?
  • 请问哪里有 《JAVA核心技术--基础知识》的电子书下载,谢谢!
  • java 基础学者
  • 一道考验基础的JAVA语法题
  • 学JAVA之前要不要先学一些基础的东西?
  • 学习Java的流程是怎样的?我有了java和oop的基础,能否开始学EJB(J2EE)???
  • 请大家谈一下JAVA的学习经验,如何能打下扎实的基础?
  • java 2 基础类,哪里有完整的说明?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • MySocketServer.java 使用或覆盖一个不鼓励使用的API???
  • java将类序列化并存储到mysql(使用hibernate)
  • JAVA中不赞成使用(Deprecated)的方法是否可以使用
  • 各位使用过JAVA的朋友们!JAVA好用吗?它有向VC那样的集成开发环境吗?
  • java 可以使用 可是javac不可以使用。老兄帮帮忙
  • 哪位知道如何用JAVA进行图形文件的缩放? 是使用JAVA2D 或是有第三方的软件?
  • java堆栈类使用实例(java中stack的使用方法)
  • env查看环境变量,JAVA_HOME明明在里面,但使用nutch时还是提示JAVA_HOME not set?
  • 如何使用linux下的java编译器????
  • 如何使用java这个命令?
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • linux 远程上使用java
  • UNIX下使用java运行class的问题
  • java:sun公司的联机帮助如何使用?
  • 请教如何使用Java编写的Applet程序关闭浏览器??
  • 怎么使用 JAVA 的包呀???
  • 针对使用java进行硬件编程
  • java正则表达式获取url的host示例 iis7站长之家
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • 使用java时间的调查,谢谢大家
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3