java网络通信之非阻塞通信

java中提供的非阻塞类主要包含在java.nio,包括:

1、ServerSocketChannel:ServerSocket替代类,支持阻塞与非阻塞;

2、SocketChannel:Socket的替代类,支持阻塞与非阻塞;

3、Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读和写事件;

4、SelctionKey:代表ServerSocketChannel及SocketChannel向Selector注册事件,当一个SelectionLKey对象位于Selector的selected-keys集合中时,就表示与这个SelectionKey相关的事件发生。

以上中,SocketChannel以及ServerSocketChannel均是SelectableChannel类的子类,而这个类又继承了Channel接口。

SelectableChannel类向Selector类注册来监控前者可能发生的事件,过程为:SelectionKey key = serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT)。

SocketChannel中发送和接收数据的方法为:

1、read(ByteBuffer buffer):将接收到的数据存放在指定的buffer中;

2、write(ButeBuffer buffer):将buffer中的数据发送出去。

Buffer(抽象类,位于java.nio包):

Buffer的属性:

1、容量,表示缓冲区可以保存的数据数量;

2、极限,表示换从去的当前终点,不能对超过缓冲区极限的区域进行读写,说白了就是极限之前的数据是有效的,之后的无效,不能大于容量;

3、位置,表示缓冲区下一个读写单元的位置,每次读写时会改变这个数值,不能大于极限;

缓冲区改变三个属性的方法:

1、clear(),极限设置为容量,位置置为0;

2、flip(),把极限设置为位置,再把位置置为0;

3、rewind(),不改变极限,把位置置为0。

Buffer有很多子类:

1、ByteBuffer,没有构造方法,需要静态类:

  1)、allocate(int capacity),返回ByteBuffer类对象,capacity指定缓冲区的大小;

  2)、directAllocate(int capacity),同上,I/O操作速度快,但是系统开销大。

2、除boolean之外的其它基本类型都有buffer类,都有allocate(int capacity)静态方法返回实例;

3、MappedByteBuffer,ButeBuffer类的子类,把缓冲区和文件某个区域直接映射。

读写缓冲区的方法如下:

1、get(),冲缓冲区当前位置读取一个单元数据,读完后把位置加1;

2、get(int index),绝对读,从index位置读数据但不改位置;

3、put(),向缓冲区当前位置写一个数据,然后位置加1;

4、put(int index),绝对写,向index位置写数剧单不改位置。

字符编码Charset(java.nio)

该类实例代表特定的字符编码类型,其编码与解码的方法如下:

1、ByteBuffer encode(String str),将字符串str转换为Byte并保存在ByteBuffer中;

2、ByteBuffer encode(CharBuffer cb),同上;

3、CharBuffer decode(ByteBuffer b),将b转换为CharBuffer;

Charset类中有静态方法forName(String encode)返回Charset对象,参数指定编码类型;还有一个defaultCharset()返回本平台默认字符编码的Charset对象。

Channel(java.nio.channels)接口用于连接缓冲区与数据源或者数据目的地,数据源的数据经过通道到达缓冲区,然后缓冲区的数据再经过通道到达目的地,其中包括两个方法:

1、close(),关闭通道;

2、isOpen(),判断通道是否打开。

Channel的子接口很多:

1、ReadableByeChannel接口,声明read(ByteBuffer dst),把数据源的数据读入到ByteBuffer;

2、WriteByteChannel接口,声明write(ByteBuffer src),将ByteBuffer中的数据写入到目的地。

3、ScatterByteChannel接口,分散读取数据,单个读取操作能填充多个缓冲区,它提供了read(ByteBuffer[] src),将读取的数据依次填充到ByteBuffer各个元素中;

4、GatheringByteChannel接口,集中写入数据,声明了write(ByteBuffer[] scrs),将各个ByteBuffer写入到指定的目的地;

5、FileChannel类,实现了ByteChannel、ScatteringByteChannel和GatherByteChannel,不能new,只能通过FileInputStream、FileOutputStrem、RandomAccessFile的getChannel()返回相应的FileChannel。

6、SelectableChannel,支持阻塞和非阻塞的I/O,其方法包括:

  1)、public SelectableChannel configureBlocking(boolean block) throws IOException,block为false时,表示为把SelectableChannel设置为非阻塞模式;

  2)、isBlocking()判断SelectableChannel是否为阻塞模式;

  3)、public SelectionKey register(Selector sel, int ops) throws ClosedChannelException;

  4)、public SelectionKey register(Selector sel,int ops,Object attachment) throws ClosedChannelException,这两个方法均向Selector注册事件,其中Object为SelectionKey关联的一个附件。

上一篇:March 08th, 2018 Week 10th Thursday


下一篇:Servlet 2.5为cookie配置HTTPOnly属性