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. 嵌入式系统及应用课程设计——基于STM32的温湿度监测系统

    大三上学期期末总结,嗯,没错上学期,写在新学期开始,hhh. 上学期学了一门嵌入式系统及应用的课程,期末的课程设计题目是基于STM32的温湿度监测系统. 记得刚开始做课程设计的时候,听说先设计画出原理 ...

  2. iptables 指南

    iptables 是 Linux 内核集成的防火墙系统, 几乎所有 Linux 发行版都会内置 iptables. iptables 对进出的 IP 数据报进行处理和过滤, 过滤规则(rule)存储在 ...

  3. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...

  4. C# 判断用户是否对路径拥有访问权限

    如何获取当前系统用户对文件/文件夹的操作权限? 1.获取安全信息DirectorySecurity DirectorySecurity fileAcl = Directory.GetAccessCon ...

  5. 学JAVA第十一天,属性与方法

    今天清明节假期结束第二天,昨天请了一天假去考科目二,还好考过了,O(∩_∩)O哈哈~~~~ 今天老师讲了类的属性与方法的使用 就用代码来说明吧: package pkg3;public class T ...

  6. CSS3背景,渐变

    1,有利于代码维护,有利于使用debug进行调试打断点.2,后面三个都存在计算,所以分开写最好.背景复合属性最好的写法,background:#abcdef url() no-repeat 50px ...

  7. BOM—浏览器对象模型(Browser Object Model)

     1,javascript   组成部分: 1.ECMAscript(核心标准):    定义了基本的语法,比如:if for 数组 字符串 ... 2.BOM  : 浏览器对象模型(Browser ...

  8. CSS Grid 布局完全指南(图解 Grid 详细教程)

    CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...

  9. Thrift 入门教程

    1. 概述 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erl ...

  10. Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约

    目录 目录 1.什么是 Truffle? 2.适合 Truffle 开发的客户端 3.Truffle的源代码地址 4.如何安装? 4.1.安装 Go-Ethereum 1.7.2 4.2.安装 Tru ...