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); 
        } 
    } 
} 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/10312.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论