网络IO
所有Socket通道都继承了AbstractSelectableChannel,意味着用一个Selector对象来执行socket通道的就绪选择。
1.1 SocketChannel与ServerSocketChannel
- SocketChannel定义读和写功能的接口,而ServerSocketChannel不实现。ServerSocketChannel负责监听传入的连接和创建新的S哦创可贴Channel对象,它本身不传输数据。
1.1.2 ServerSocketChannel
ServerSocketChannel是一个基于通道的socket监听器,用于监听。
ServerSocketChannel没有bind方法
ServerSocketChannel中有accpeit方法,返回一个 SocketChannel类型的对象。在非阻塞模式下,当没有传入连接等待时,立刻返回null。
Buffer
Java NIO的Buffer用于和NIO通道进行交互,数据从通道读入缓冲区,从缓冲区写入到通道中。缓冲区本质上是一块可以写入数据,然后读取数据的内存。
所有的缓冲区类型都继承于抽象类Buffer:
Buffer的基本用法
- 写入数据到Buffer
- 调用flip:读取数据时,需要通过flip方法将Buffer从写模式切换成读模式。
- 从Buffer中读取数据。
- 调用Clear或者compact方法:clear方法回清空整个缓冲区,compact方法只会清除已经读过的数据。
Buffer的capacity、position和limit
- capacity:
Buffer的固定大小值,一旦Buffer满了,需要清空才能继续写数据。 - position:
(1)写入数据到Buffer时,position表示写入数据的当前位置,position的初始值为0。当插入数据到Buffer后,position会移动到下一个可插入的Buffer单元。position最大值为capacity-1。
(2)读数据到Buffer时,position表示读入数据的当前位置。通过flip方法切换到读模式的时候,position会被重置为0,当Buffer从position读入数据后,position会下移到下一个可读入的数据Buffer单元。 - limit:
(1)写数据时,limit表示可对Buffer最多写入多少个数据。
(2)读数据时,limit表示Buffer中有多少可读的数据。
Buffer写数据
- 通过Channel写数到Buffer
- 通过Buffer的put方法写数据到Buffer
Buffer读数据
- 从Buffer中读数据到Channel
- 使用get方法从Buffer中读取数据
Buffer的常见方法
方法 | 功能 |
---|---|
rewind | 将position设置为0,重新读取Buffer中的所有数据,limit保持不变 |
clear | Buffer中内容清空掉 |
compact | 读过的数据清除掉,未读的数据拷贝到Buffer起始处 |
mark/reset | mark标记Buffer中的一个特定position,通过reset恢复到这个position |