1,Channel
FileDescriptor:
image.pngfd文件描述符。representing an open file, an open socket, or another source or sink of bytes.
1)可以异步读写的通道,代表一个到可进行I/O操作实体(file、socket、hardware device
)的开放连接。Channel中的数据总是会读取到Buffer或者从Buffer中写入。
2)主要实现类
核心:EpollSelectorImpl 是linux上SelectorProvider的实现。
FileChannel:文件中读写数据。打开文件时返回fd,通过fd和FileChannelImpl创建FileChannel
image.png
DatagramChannel:通过UDP读写网络中的数据。借助SelectorProvider new一个DatagramChannelImpl。底层:通过Net打开socket,返回fd。
image.png
SocketChannel:通过TCP读写网络中的数据。通过SocketChannelImpl创建SocketChannel。底层使用this.fd = Net.socket(true);创建fd。
image.png
image.png
ServerSocketChannel:监听TCP连接,创建SocketChannel。
image.png
image.png
3)Socket、SocketChannel 以及 ServerSocket、ServerSocketChannel的区别。
Socket与SocketChannel:实现客户端与服务端连接;Socket在java.net包,SocketChannel在java.nio包;Socket是阻塞连接,SocketChannel可以设置非阻塞。
ServerSocket:Socket通常是阻塞连接,服务端ServerSocket为客户端Socket分配单独的线程,线程可能处于长时间的阻塞状态。
ServerSocketChannel:服务端借助Selector,可以使用一个线程处理多个客户端Socket请求。
ServerSocket的accept方法底层:native void socketAccept(SocketImpl s) throws IOException;
image.png
ServerSocketChannel底层:native int accept0(FileDescriptor var1, FileDescriptor var2, InetSocketAddress[] var3) throws IOException;
image.png
4)使用方式
image.png
SelectionKey :代表channel向selector注册的令牌。
image.png
OP_READ = 1 << 0:read operations.
OP_WRITE = 1 << 2:write operations.
OP_CONNECT = 1 << 3:socket-connect operations.
OP_ACCEPT = 1 << 4:socket-accept operations.
2,Buffer
1)本质:
image.png一块可以写入数据、读取数据的内存。
2)4个属性
3)2种模式
image.png
flip切换至read模式
image.png
clear切换至write模式
image.png
4)使用channel来操作buffer
Channel的读操作从channel读,写入到buffer中
:
image.png
Channel的写操作将buffer中的数据读出,写入channel中
:
image.png
写入Buffer的2种方式:
int bytesRead = inChannel.read(buf);
buf.put(127);
从Buffer读的2种方式:
int bytesWritten = inChannel.write(buf);
byte aByte = buf.get();
从文件中读取到buffer,打印:
image.png
将buffer中数据,写入到channel ->文件中
image.png
5)ByteBuffer实现类
ByteBuffer底层字节数组final byte[] hb;
image.png
堆内存
image.png
image.png
直接内存,基于Unsafe
image.png
image.png
网友评论