java中非阻塞网络编程中NIO知识点介绍

来源:互联网 发布:标准差 知乎 编辑:程序博客网 时间:2024/06/07 12:40

1.BIO/NIO/AIO介绍

    BIO:阻塞到应用程序级别上IO的read或write方法上。
    NIO:采用多路复用的方式select进行事件轮询的来进行实现同步非阻塞的方式。
    AIO:异步非阻塞io。

java.nio包中的主要类

1.ServerSocketChanne类:ServerSocket的替代类,支持阻塞通信与费阻塞通信。
2.SocketChannel类:Socket的替代类,支持阻塞通信与非阻塞通信。
3.Selector类:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪、写就绪等事件。
4.SelectionKey:代表ServerSocketChannel以及SocketChannel向Selector注册事件的句柄。当一个SelectionKey对象位于Selector对象的selected-key集合中时,就表示与这个SelectionKey对象相关的事件发生了。

其中,SelectionKey类的一些静态常亮表示事件类型,ServerSocketChannel只可能发生一种事情:

     1.SelectionKey.OP_ACCEPT:接收连接事件。表示至少有了一个客户连接,服务器可以接收这个连接了。

SocketChannel可能发生以下3中事情:

     1.SelectionKey.OP_ACCEPT:接收连接就绪事件。表示客户与服务器的连接已经建立起来,接下来可以进行相互交互。

     2.SelectionKey.OP_READ:读就绪事件。表示输入流中已经有了可读数据,可以执行读取操作了。

     3.SelectionKey.OP_WRITE:写就绪事件。表示已经可以向输出流写数据了。

SocketChannel提供了接收和发送数据的方法。

     1.read(ByteBuffer buffer) :接收数据,把他们存放到参数指定的缓存区对象中。

     2.write(ByteBuffer buffer):把参数指定的缓存对象数据发送出去。

其中,ByteBuffer表示字节缓冲区,SocketChannel的read和write方法都会操作它。它继承与Buffer类。为了将它转换为字符串,需要用到Charset类,Charset类代表字符编码,它提供了把字节流转换为字符串(解码过程)和把字符串转换为字节流(编码过程)的使用方法。

缓冲区Buffer

缓冲区主要包含ByteBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer、CharBuffer等等,他们都具有一下属性:

1.容量capacity:表示该缓冲区可以保存多少数据。

2.极限limit:表示当前缓冲区的当前终点,不能对缓冲区中超过极限的区域进行读写操作。limit是可以修改的,这有利于重用。

3.位置position:表示缓冲区中下一个读写单元的位置,每次读写缓冲区的数据均放在position处。

三者关系:容量>=极限>=位置。

缓冲区提供了用于改变上面3个属性的方法:

a.clear():把极限设为容量,把位置设置为0.

b.flip():把极限limit设为位置,把位置设为0.

c.rewind():不改变极限,把位置设为0.

Buffer类还提供了remaining方法用于判断缓冲区的剩余容量等于极限-位置。提供了get(),get(int index),put(),put(int index)等方法进行读取操作。

字符编码Charset类

这类的每个实例代表特定的字符编码类型。把字节序列转换为字符串的过程为解码,把字符串转换为字节序列的过程为编码。

Charset类提供了编码与解码的方法:

1.ByteBuffer encode(String str):对参数str进行编码,返回字节缓冲区对象。

2.ByteBuffer encode(CharBuffer cb):对参数的字符缓冲区进行编码,返回字节缓冲区。

3.CharBuffer decode(ByteBuffer bb):对字节缓冲区数据进行解码操纵。

可以通过Charset类的方法forName(String encode)方法返回一个对象,参数为编码类型。还有一个默认字符编码的方法defaultCharset()来创建对象。










0 0
原创粉丝点击