java.nio包中的主要类
ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。
SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。
Selector:为ServerSocketChannel监控接收连接的就绪事件,为SocketChannel监控连接就绪、读就绪或写就绪事件。
SelectionKey:代表ServerSocketChannel及SocketChannel向Selector注册事件的句柄。当一个SelectionKey对象位于Selector对象的Selected-keys集合中时,就表示与这个SelectionKey对象相关的事件发生了。
ServerSocketChannel及SocketChannel都是SelectabletChannel的子类。SelectabletChannel类及其子类都能委托Selector来监控他们可能发生的一些事件。这种委托过程也称为注册事件过程。
ServerSocketChannel向Selector注册接收连接就绪事件:
SelctionKey key = serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
SocketChannel可能发生以下3钟事件:
SelectionKey.OP_CONNECT:连接就绪事件
SelectionKey.OP_READ:读就绪事件,表示输入流中已经有了可读数据
SelectionKey.OP_WRITE:写就绪事件,表示已经可以向输出流写数据了。
SocketChannel提供了接收和发送数据的方法
read(ByteBuffer buffer):接收数据,把他们存放到参数指定的ByteBuffer中。
write(ByteBuffer buffer):把参数指定的ByteBuffer中的数据发送出去。
ByteBuffer表示字节缓冲区,ByteBuffer继承于Buffer类。ByteBuffer存放字节,为了把他们转换为字符串,还需要用到Charset类,Charset类代表字符编码,它提供了把字节流转换为字符串(解码过程)和把字符串转换为字节流(编码过程)的实用方法。
-----
Charset类提供了编码与解码方法:
ByteBuffer encode(String str):对参数str指定的字符串进行编码,把得到的字节序列存放在一个ByteBuffer对象中,并将其返回。
ByteBuffer encode(CharBuffr cb):字符到字节(编码)
CharBuffer decode(ByteBuffer bb):字节到字符(解码)
Charset类的静态forName(String encode)方法返回一个Charset对象,
Charset charset = Charset.forName("GBK");
--------
ServerSocketChannel类
ServerSocketChannel ssc = ServerSocketChannel.open();
这个方法没有与任何本地端口绑定,并且处于阻塞模式;
SocketChannel sc = ssc.accept();用于接收客户连接,如果ServerSocketChannel处于非阻塞模式,当没有客户连接时,该方法立即返回null.返回的SocketChannel是阻塞的,要设置非阻塞需要socketChannel.configureBlocking(false);[p/95页详细信息】
-------
Selector类:
只要ServerSocketChannel及SocketChannel向Selector注册了特定的事件,Selector就会监控这些事件是否发送。SelectableChannel的register()方法负责注册事件,该方法返回一个SelectionKey对象,该对象是用于跟踪这些注册事件的句柄。一个Selector对象中会包含3中类型的SelectionKey集合。
1、all-keys集合:当前所有想Selector注册的SelectionKey集合,Selector的keys方法返回该集合。
2、selected-key集合:相关事件已经被Selector捕获的SelectionKey的集合。Selector的selectedKeys()方法返回该集合。
3、cancelled-keys集合:已经被取消的SelectionKey的结合。Selector没有提供访问这种集合的方法。
当执行SelectableChannel的register()方法时,该方法新建一个SelectionKey,并把它加入Selector的all-keys集合中。
如果关闭了与SelectionKey对象关联的Channel对象,或者调用了SelectionKey对象的cancel()方法,这个SelectionKey对象就会被加入cancelled-keys集合中,表示这个SelectionKey对象已经被取消,在程序下一次执行的Seelector的select()方法时,被取消的SelectionKey对象将从所有的集合中删除。
在执行Selector的select()方法时,如果与SelecitonKey相关的事件发生了,这个SeletionKey就被加入到selected-keys集合中。程序直接调用selected-keys集合的remove()方法,或者调用它的Itertor的remove()方法,都可以从selected-keys集合中删除一个SelectionKey对象。
Selector主要的方法:
public static Selector open();创建一个Selector对象;
public boolean isOpen();Selector对象创建好了就处于打开状态
public Set<SelectionKey> keys()返回Selector的all-keys集合,它包含了所有与Selector关联的SelectiOnKey对象。
public int selectNow();返回相关事件已经发生的SelectionKey对象的数目。
public int select();
public Selector wakeup();唤醒执行Seletor的方法的线程。
------------
SelctionKey类
SeverSocketChannel或Socket类通过register()方法向Selector注册事件时,register()方法会创建一个SelectionKey对象,这个SelectionKey对象是用来跟踪注册事件的句柄。在SelectionKey对象的有效时间,Selector会一直监控与SelectionKey对象相关的事件,如果事件发生,就会把SelectionKey对象加入seleected-keys集合中。以下情况下SelectionKey对象会失效。
1、程序调用了SelectionKey的cancel()方法。
2、关闭与SelectionKey关联的Channel
3、与SelectionKey的Selector被关闭。
在SelectionKey中定义了4中事件:
SelecitonKey.OP_ACCEPT:接收连接就绪事件,表示服务器监听到了客户连接,服务器可以接收这个链接了。常量值为16。
SelectionKey.OP_CONNECT:连接就绪事件,表示客户与服务器的连接已经建成功了。常量值为8.
SelectionKey.OP_READ:读就绪事件,表示通道中已经有了可读数据,可以执行读操作了。常量值为1.
SelecitonKey.OP_WRITE:写就绪事件,表示已经可以向通道写数据了。常量值为4.
返回值为SelecitonKey.OP_WRITE|SelectionKey.OP_READ就表示这个SelectionKey对读就绪和写就绪事件感兴趣。与之关联的Selector对象会负责监控这些事件。当通过SelectableChannel的register()方法注册事件时,可以在参数中指定SelectionKey感兴趣的事件。
SelectionKey = key socketChannel.register(selector,SelecitonKey.OP_WRITE|SelectionKey.OP_READ);
SelecitonKey的interestOps(int ops)方法用于为SelectionKey对象增加一个感兴趣的事件。
key.interestOps(SelecitonKey.OP_WRITE);
所有已经发生的事件:SelectionKey的readyOps()方法返回所有已经发生的事件。例如,假如返回值为SelecitonKey.OP_WRITE|SelectionKey.OP_READ。表示读就绪和写就绪事件已经发生了,这就意味着与之关联的SocketChannel对象可以进行读操作和写操作了。
当程序调用了一个SelectableChannel的register(selector,xxx)方法,该方法建立了SelectableChannel对象、Selector对象以及register()方法所创建的SelecitonKey对象之间的管理关系。
SelectionKey主要方法:
public SelectableChannel channel():返回与这个SelectionKey对象关联的SelectableChannel对象。
public Selector selector():返回与这个SelectionKey对象关联的Selector对象。
public boolean isValid()判断这个SelectionKey是否有效。
public void cancel();使这个SelectionKey对象失效。
public int interestOps()返回这个SelectionKey感兴趣的事件。
public int interestOps(int ops),增加感兴趣事件
public int readyOps():返回已经就绪的事件
public final boolean isReadable();判断与之关联的SocketChannel的读就绪事件是否已经发生。该方法等价于:key.readyOps()&&OP_READ !=0
public final boolean isWritable()
public final boolean isConnectAble();
public final boolean isAcceptable();
public final Object attach(Object obj)使SelecitonKey关联一个附件。
public final Object attachment():返回SelecitonKey对象关联的附件。

ServerSocketChannel、SocketChannel、Selector等概念04的更多相关文章

  1. Java 阻塞

    对于用ServerSocket 及 Socket 编写的服务器程序和客户程序, 他们在运行过程中常常会阻塞. 例如, 当一个线程执行 ServerSocket 的accept() 方法时, 假如没有客 ...

  2. javaAPI1

    Iterable<T>接口, Iterator<T> iterator() Collection<E>:接口,add(E e) ,size() , Object[] ...

  3. java的nio之:java的nio系列教程之selector

    一:Java NIO的selector的概述===>Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程 ...

  4. NIO组件Selector详解

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...

  5. Selector 实现原理

    概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代表这一个网络连接通道,我们可以将Ch ...

  6. 7. 彤哥说netty系列之Java NIO核心组件之Selector

    --日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第七篇. 简介 上一章我们一起学习了Java NIO的核心组件Buffer,它通常跟Channel一起使用,但是它们在网络IO中又该如何 ...

  7. (四:NIO系列) Java NIO Selector

    出处:Java NIO Selector 1.1. Selector入门 1.1.1. Selector的和Channel的关系 Java NIO的核心组件包括: (1)Channel(通道) (2) ...

  8. Java NIO Selector 的使用

    之前的文章已经把 Java 中 NIO 的 Buffer.Channel 讲解完了,不太了解的可以先回过头去看看.这篇文章我们就来聊聊 Selector -- 选择器. 首先 Selector 是用来 ...

  9. NIO的Selector

    参考自 Java NIO系列教程(六) Selector Java-NIO-Selector java.nio.channels.Selector NIO新功能Top 10(下) 出发点: 如何管理多 ...

随机推荐

  1. 【Vue】----- computed与watch的区别

    1.computed computed是一种计算属性,用来监听属性的变化: computed里面的方法调用的时候不需要加(),并且里面的方法必须要有一个返回值: computed里面的方法不是通过事件 ...

  2. Java开发知识之Java中的集合上List接口以及子类讲解.

    Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...

  3. MySql 注意点

    每条操作语句的结束都要加:(遇到:就会执行操作) DELIMITER 其实本身相当 :当存储过程中包含:的时候,就需要用 DELIMITER 来区分 我们会经常看到 DELIMITER $$ 或者DE ...

  4. c# API接收Base64转图片

    /// <summary> /// API接收Base64转图片 /// </summary> /// <param name="Img">图片 ...

  5. spring boot 2.0 整合 elasticsearch6.5.3,spring boot 2.0 整合 elasticsearch NoNodeAvailableException

    原文地址:spring boot 2.0 整合 elasticsearch NoNodeAvailableException 原文说的有点问题,下面贴出我的配置: 原码云项目地址:https://gi ...

  6. Linux下GitLab服务器搭建

    系统环境 操作系统:CentOS6.9关闭防火墙 安装步骤 1. 安装Postfix 2. 下载rpm包并安装 3. 配置gitlab,vim /etc/gitlab/gitlab.rb,指定ip+端 ...

  7. 聊聊我的 Java 自学之路

    最近经常在知乎收到类似『没基础,java 如何自学』.『怎么才能掌握编程』等等问题,再加上发现高中同学也在自学.有感而发,讲讲我的自学之路. 1.1. 大学 高考没正常发挥,考入一所二流的学校,当时分 ...

  8. linux学习笔记-配置vbox虚拟机本地连接和外网同时可用

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 在设置网络里面启用两个网卡,一个桥接,一个网络地址转换 archlinux系统下第一个网络地址转换,第二个桥接 centos7系 ...

  9. iOS----------The Apple Developer Program License Agreement has been updated.

    The Apple Developer Program License Agreement has been updated. In order to access certain membershi ...

  10. Android ScrollView和ListView滑动冲突解决记录

    private int mLastX; private int mLastY; public View.OnTouchListener onTouchListener = new View.OnTou ...