zoukankan      html  css  js  c++  java
  • JAVA NIO 基础学习

    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);
            }
        }
    }
  • 相关阅读:
    不要对父母说的十句话
    25句世界上最經典的話
    奥巴马(Obama)获胜演讲全文[中英对照]+高清视频下载
    【心理测试】男人眼中女人哪里最性感?
    一张图看出你是用左脑还是右脑
    我是有原则的~~(笑话转贴)
    各行各业常用大用大谎言
    你知道我今天为啥要来上班吗?
    女性抽烟腰会变粗?
    心理学家揭秘人临死时的感受
  • 原文地址:https://www.cnblogs.com/tuanz/p/8709110.html
Copyright © 2011-2022 走看看