首页 > 代码库 > java nio 第一弹
java nio 第一弹
java NIO 第一弹----概览
摘要:
Non-blocking I/O (usually called NIO, and sometimes called "New I/O") is a collection of Java programming language APIs that offer features for intensive I/Ooperations. It was introduced with the J2SE 1.4 release of Java by Sun Microsystems to complement an existing standard I/O. NIO was developed under the Java Community Process as JSR 51.[1]
大意:非阻塞I/O(通常叫做NIO,有时也叫新的I/O),是一组提供了加强版I/O操作特性的java api。在java1.4时由sun公司引入。
本系列主要着眼于网络部分,对本地文件操作没有涉及。接下来先看一段代码,展示了最简单Echo服务端。
代码示例
1 ByteBuffer bb = ByteBuffer.allocate(1024); 2 /**创建选择器*/ 3 Selector selector = Selector.open(); 4 /**打开一个服务端通道*/ 5 ServerSocketChannel ssc = ServerSocketChannel.open(); 6 /**设置为非阻塞*/ 7 ssc.configureBlocking(false); 8 /**从通道中拿到服务端socket*/ 9 ServerSocket ss = ssc.socket();10 /**绑定一个端口*/11 InetSocketAddress addr = new InetSocketAddress(1234);12 ss.bind(addr);13 /**注册感兴趣事件,服务端通道只能注册接受事件*/14 ssc.register(selector, SelectionKey.OP_ACCEPT);15 String receivedMsg = "";16 /**主循环*/17 while(true){18 int num = selector.select();19 System.out.println(num+"个事件发生。。。");20 Set<SelectionKey> selectedKeys = selector.selectedKeys();21 Iterator<SelectionKey> it = selectedKeys.iterator();22 23 /**循环处理每个通道事件*/24 while(it.hasNext()){25 SelectionKey key = it.next();26 it.remove();27 if(key.readyOps() == SelectionKey.OP_ACCEPT){28 System.out.println("新连接建立事件");29 ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();30 SocketChannel sc = serverSocketChannel.accept();31 sc.configureBlocking(false);32 sc.register(selector, SelectionKey.OP_READ);33 }else if((key.readyOps()&SelectionKey.OP_READ) == SelectionKey.OP_READ){34 System.out.println("读事件");35 SocketChannel sc = (SocketChannel) key.channel();36 sc.read(bb);37 receivedMsg = new String(bb.array(),0,bb.position());38 bb.clear();39 sc.register(selector, SelectionKey.OP_WRITE);40 }else if(key.readyOps() == SelectionKey.OP_WRITE){41 System.out.println("写数据");42 SocketChannel sc = (SocketChannel) key.channel();43 sc.write(ByteBuffer.wrap(receivedMsg.getBytes()));44 /**没有cancel就会一直循环进入此处,因为只要通道不阻塞会一直有写事件,所以使用完需要取消*/45 key.cancel();46 }else{47 System.out.println("other event");48 }49 }50 }
此处代码是一个将收到的信息发回去的服务端代码,给出了使用nio写服务端的一般流程。
此处可以先有个概念和总体认识,接下来会对涉及到的重要的类进行介绍,欢迎批评指正,大家讨论进步。
注:本例没有处理IOException,实际代码要处理,不然一个客户端强行关闭socket就会使服务端挂掉。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。