博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java NIO简单使用
阅读量:5830 次
发布时间:2019-06-18

本文共 5218 字,大约阅读时间需要 17 分钟。

hot3.png

Java NIO简单使用

看代码

package nio2;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;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;import java.util.Set;public class PlainNioServer {    public void serve(int port) throws IOException {        System.out.println("Listening for connections on port " + port);        //声明服务器端ServerSocketChannel通道        ServerSocketChannel serverChannel;        //声明一个多路复用器Selector        Selector selector;        serverChannel = ServerSocketChannel.open();        ServerSocket ss = serverChannel.socket();        InetSocketAddress address = new InetSocketAddress(port);        ss.bind(address);        serverChannel.configureBlocking(false);        selector = Selector.open();        /**         * Registers this channel with the given selector, returning a selection         * key.         * The interest set for the resulting key         */        serverChannel.register(selector, SelectionKey.OP_ACCEPT);        final ByteBuffer msg = ByteBuffer.wrap("Hi!\r\n".getBytes());        while (true) {            try {                System.out.println(">>>>>等待感兴趣事件已经就绪的通道>>>>");                selector.select();            } catch (IOException ex) {                ex.printStackTrace();                break;            }            System.out.println(">>>>>返回就绪通道的键值>>>>>");            Set readyKeys = selector.selectedKeys();            Iterator iterator = readyKeys.iterator();            while (iterator.hasNext()) {                SelectionKey key = (SelectionKey) iterator.next();                iterator.remove();                try {                    if (key.isAcceptable()) {                        System.out.println("--该键表示的通道的Accept事件就绪--");                        ServerSocketChannel server = (ServerSocketChannel) key.channel();                        SocketChannel client = server.accept();                        System.out.println("Accepted connection from " + client);                        client.configureBlocking(false);                        client.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, msg.duplicate());                    }                    if (key.isWritable()) {                        System.out.println("--该键表示的通道的Writable事件就绪--");                        SocketChannel client = (SocketChannel) key.channel();                        ByteBuffer buffer = (ByteBuffer) key.attachment();                        while (buffer.hasRemaining()) {                            if (client.write(buffer) == 0) {                                break;                            }                        }                        client.close();                    }                } catch (IOException ex) {                    key.cancel();                    try {                        key.channel().close();                    } catch (IOException cex) {                    }                }                System.out.println("++++++++++++++++++++++++++++++++++++++++++\r\n");            }        }    }    public static void main(String args[]) throws IOException {        int port = 8080;        PlainNioServer plainNioServer = new PlainNioServer();        plainNioServer.serve(port);    }}

看结果分析Java NIO的处理过程

Listening for connections on port 8080

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63535]

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63536]

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63538]

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63539]

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63540]

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++

>>>>>等待感兴趣事件已经就绪的通道>>>>

==============END==============

转载于:https://my.oschina.net/xinxingegeya/blog/282084

你可能感兴趣的文章
java只能的round,ceil,floor方法的使用
查看>>
新开的博客,为自己祝贺一下
查看>>
【CQOI2011】放棋子
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
线性表4 - 数据结构和算法09
查看>>
uva-317-找规律
查看>>
我的2014-相对奢侈的生活
查看>>
Java设计模式
查看>>
一文读懂 AOP | 你想要的最全面 AOP 方法探讨
查看>>
Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
查看>>
ORM数据库框架 SQLite 常用数据库框架比较 MD
查看>>
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>