当前位置 : 主页 > 网络编程 > 其它编程 >

JAVANIOSelector知识四

来源:互联网 收集:自由互联 发布时间:2023-07-02
Selector选择器Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以 Selector选择器 Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以做别的事情当有事件发生的时
Selector选择器Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以

Selector选择器

Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以做别的事情当有事件发生的时候selector会通知我们然后获取selectionkey获得我们感兴趣的事件。

selecotr是java nio多路复用的关键类selector实现了一个线程管理多个channel只需要更少的资源来处理更多的通道节省线程之间的开销这么说seletor是以前cpu很贵的时候现在很多公司的机器都是多核充分利用cpu才是最好的应用后期会写些JAVA NIO的最佳实践netty。

下面写几个简单的例子

Seletor的创建方式

1 Selector selector  Selector.open();

channel注册到seletor上

1 SelectionKey key  channel.register(selector,Selectionkey.OP_READ);

channel注册到Selector后会返回一个SelectionKey对象SelectionKey代表着这个channel和注册的

selector的关系SelectionKey维护着两个重要的属性interestOps和readyops。

Selector通常会监听四种类型的事件

  • connect

  • accept

  • read

  • write

这四种事件通常用Selectionkey对应的一些

  • SelectionKey.OP_CONNECT

  • SelectionKey.OP_ACCEPT

  • SELECTIONKEY.OP_READ

  • SELECTIONKEY.OP_WRITE

1 2 3 4 5 6 7 8 9 10 11 //打开服务器端的套接字通道 ServerSocketChannel serverSocketChannel  ServerSocketChannel.open(); //服务器端设置为非阻塞 serverSocketChannel.configureBlocking(false); //服务端进行绑定 serverSocketChannel.bind(new InetSocketAddress("localhost", 8000)); //注册感兴趣的事件 Selector selector  Selector.open(); SelectionKey selectionKey  serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); selectionKey.* 可以查看一些感兴趣的事件

select()方法

1 2 3             int selectCount  selector.select();阻塞到至少有一个再注册的通道上就绪了             selector.select(timeout);这个有超时时间             selector.selectNow();这个是到无论有没有都立马就返回了

selectedKeys()方法

1 2 3  Set keys  selector.selectedKeys();             //获取迭代器  Iterator keyIterator  keys.iterator();

获取我我们需要的监听的事件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 while (keyIterator.hasNext()) {     SelectionKey key  keyIterator.next();     if (!key.isValid()) {         continue;     }     if (key.isAcceptable()) {         ServerSocketChannel  sscTemp  (ServerSocketChannel) key.channel();         //得到一个连接好的SocketChannel并把它注册到Selector上兴趣操作为READ         SocketChannel socketChannel  sscTemp.accept();         socketChannel.configureBlocking(false);         socketChannel.register(selector, SelectionKey.OP_READ);         System.out.println("REGISTER CHANNEL , CHANNEL NUMBER IS:"  selector.keys().size());     } else if (key.isReadable()) {         //读取通道中的数据         SocketChannel channel  (SocketChannel) key.channel();         read(channel);     }     keyIterator.remove(); //该事件已经处理可以丢弃                   JAVA NIO Selector 知识三 http://shangdc.blog.51cto.com/10093778/1956602 JAVA NIO buffer 知识三 http://shangdc.blog.51cto.com/10093778/1956602 JAVA NIO 之 channel通道知识二 http://shangdc.blog.51cto.com/10093778/1955874 JAVA NIO 知识一 http://shangdc.blog.51cto.com/10093778/1955793 本文转自 豆芽菜橙 51CTO博客原文链接:http://blog.51cto.com/shangdc/1956921
上一篇:Kafka常用命令行详细介绍及整理
下一篇:没有了
网友评论