JAVA NIO 基础学习
来源:互联网 发布:生产流程优化方案研究 编辑:程序博客网 时间:2024/06/10 01:27
package com.hrd.netty.demo.jnio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Iterator;/** * Created by hurd on 2016/1/26. */public class NioServerListener extends Thread { protected Selector selector; protected SocketChannel socketChannel; public NioServerListener(Selector selector){ this.selector = selector; } @Override public void run(){ try { //while循环监听事件 while(true){ //阻塞 selector.select(); //获取选择器中已经就绪的SelectionKey集合 Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); //遍历 while (iterator.hasNext()){ SelectionKey key = iterator.next(); //删除 iterator.remove(); //接受连接就绪事件 if(key.isAcceptable()){ ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); socketChannel = ssc.accept(); //套接字通道设置为非阻塞模式 socketChannel.configureBlocking(false); //向socket通道 注册读就绪事件 socketChannel.register(selector, SelectionKey.OP_READ); }else if(key.isReadable()){ //SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(100); int len = socketChannel.read(byteBuffer); /*StringBuffer dataBuffer= new StringBuffer(); while( -1 != len){ //将写模式变为读模式 byteBuffer.flip(); CharBuffer charBuffer = byteBuffer.asCharBuffer(); dataBuffer.append(charBuffer.array()); byteBuffer.clear(); len = socketChannel.read(byteBuffer); }*/ byteBuffer.flip(); //读取完毕 if(byteBuffer.limit()>0){ System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim()); } }else if(key.isWritable()){ //暂时还没想明白这个写就绪事件干嘛用的。。。 System.out.println("暂不处理"); } } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { //打开一个 ServerSocketChannel实例 并设置为false ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); //绑定ip +端口 serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1",1024)); //打开一个选择器 Selector selector = Selector.open(); //向 serverSocketChannel 注册 接收就绪事件 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); //开启线程进行监听 NioServerListener listener = new NioServerListener (selector); listener.start(); //进行控制太输入 写事件 进行通讯 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); while(true){ //java IO 阻塞读取数据 String data = bufferedReader.readLine(); if("exit".equals(data)){ if(null != listener.socketChannel){ listener.socketChannel.close(); } System.out.println("主线程关闭....."); System.exit(0); } ByteBuffer buffer = ByteBuffer.wrap(data.getBytes()); listener.socketChannel.write(buffer); } }}
客户端 监听
package com.hrd.netty.demo.jnio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.util.Iterator;/** * Created by hurd on 2016/1/26. */public class NioClientListener extends Thread { public Selector selector; public SocketChannel socketChannel; public NioClientListener(Selector selector){ this.selector = selector; } @Override public void run(){ try { //while循环监听事件 while(true){ //阻塞 selector.select(); //获取选择器中已经就绪的SelectionKey集合 Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); //遍历 while (iterator.hasNext()){ SelectionKey key = iterator.next(); //删除 iterator.remove(); socketChannel = (SocketChannel) key.channel(); //套接字通道设置为非阻塞模式 socketChannel.configureBlocking(false); //连接就绪事件 if(key.isConnectable()){ socketChannel = (SocketChannel) key.channel(); //判断连接是否完成 int i =0; while(! socketChannel.finishConnect()){ if(++i>10){ throw new RuntimeException("socket连接超时"); } System.out.println("sock连接未完成,等待中...."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } //向socket通道 注册读就绪事件 socketChannel.register(selector, SelectionKey.OP_READ); }else if(key.isReadable()){ //SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(100); int len = socketChannel.read(byteBuffer); /*StringBuffer dataBuffer= new StringBuffer(); while( -1 != len){ //将写模式变为读模式 byteBuffer.flip(); CharBuffer charBuffer = byteBuffer.asCharBuffer(); dataBuffer.append(charBuffer.array()); byteBuffer.clear(); len = socketChannel.read(byteBuffer); }*/ byteBuffer.flip(); //读取完毕 if(byteBuffer.limit()>0){ System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim()); } }else if(key.isWritable()){ //暂时还没想明白这个写就绪事件干嘛用的。。。 System.out.println("暂不处理"); } } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { //打开一个SocketChannel实例 并设置为false SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); //绑定ip +端口 socketChannel.connect(new InetSocketAddress("127.0.0.1",1024)); //打开一个选择器 Selector selector = Selector.open(); //向 serverSocketChannel 注册 连接就绪事件 socketChannel.register(selector, SelectionKey.OP_CONNECT); //开启线程进行监听 NioClientListener listener = new NioClientListener (selector); listener.start(); //进行控制太输入 写事件 进行通讯 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); while(true){ //java IO 阻塞读取数据 String data = bufferedReader.readLine(); if("exit".equals(data)){ socketChannel.close(); System.out.println("主线程关闭....."); System.exit(0); } ByteBuffer buffer = ByteBuffer.wrap(data.getBytes()); socketChannel.write(buffer); } }}
0 0
- JAVA NIO 基础学习
- Java NIO:一、NIO基础
- 【java基础】java NIO
- nio基础学习(一)
- Java NIO 基础简介
- JAVA NIO 基础
- java NIO基础概念
- java nio 基础
- java NIO基础
- Java NIO基础概念
- java nio基础
- java nio 缓冲区基础
- java nio 基础(二)
- java nio基础一
- java nio基础二
- java nio基础三
- java nio基础四
- Java NIO 基础
- Java6实现调用操作平台桌面系统
- sublime 设置自动把某个文件按指定语法解析
- Network 【CornerStone托管配置SVN】
- Android面试题库(整理好的干货)
- [python]性能优化的20条建议
- JAVA NIO 基础学习
- 【ReactNative/JS】uint8array转string convert uint8array to string
- MySql拆分字符串(split拆分查找)
- PHPCMS 文件目录结构
- BestCoder 2nd Anniversary C.Wool
- c语言联合union 的联合变量,联合标记,联合类型定义的区别
- PHPCMS 前台模板集合
- 蓝桥杯 BASIC-23 基础练习 芯片测试
- 【C语言】写一个宏交换数字的奇数位与偶数位