目录
1.概览
1.1 介绍
官方解释
Unsafe operations that should never be called from user-code. These methods are only provided to implement the actual transport, and must be invoked from an I/O thread except for the following methods:
这个接口的方法主要用来做实际传输的,并且必须被一个IO线程调用,不能被开发者调用。
2. 分析
2.1 Unsafe接口
public interface Unsafe {
Handle recvBufAllocHandle();
SocketAddress localAddress();
SocketAddress remoteAddress();
void register(EventLoop var1, ChannelPromise var2);
void bind(SocketAddress var1, ChannelPromise var2);
void connect(SocketAddress var1, SocketAddress var2, ChannelPromise var3);
void disconnect(ChannelPromise var1);
void close(ChannelPromise var1);
void closeForcibly();
void deregister(ChannelPromise var1);
void beginRead();
void write(Object var1, ChannelPromise var2);
void flush();
ChannelPromise voidPromise();
ChannelOutboundBuffer outboundBuffer();
}
2.2 Unsafe接口实现类
刚才也说到了,Unsafe接口被作为Channel接口的内部接口,那要看Unsafe接口的具体实现就必须到Channel接口的各个实现类去看看。Channel接口的实现类相当多,从idea导出
AbstractChannel (io.netty.channel)
AbstractEpollChannel (io.netty.channel.epoll)
AbstractEpollServerChannel (io.netty.channel.epoll)
EpollServerDomainSocketChannel (io.netty.channel.epoll)
EpollServerSocketChannel (io.netty.channel.epoll)
AbstractEpollStreamChannel (io.netty.channel.epoll)
EpollSocketChannel (io.netty.channel.epoll)
EpollDomainSocketChannel (io.netty.channel.epoll)
EpollDatagramChannel (io.netty.channel.epoll)
LocalChannel (io.netty.channel.local)
AbstractHttp2StreamChannel (io.netty.handler.codec.http2)
Http2StreamChannel in Http2MultiplexCodec (io.netty.handler.codec.http2)
EmbeddedChannel (io.netty.channel.embedded)
AbstractOioChannel (io.netty.channel.oio)
AbstractOioByteChannel (io.netty.channel.oio)
OioByteStreamChannel (io.netty.channel.oio)
OioSocketChannel (io.netty.channel.socket.oio)
RxtxChannel (io.netty.channel.rxtx)
AbstractOioMessageChannel (io.netty.channel.oio)
OioSctpServerChannel (io.netty.channel.sctp.oio)
OioServerSocketChannel (io.netty.channel.socket.oio)
OioSctpChannel (io.netty.channel.sctp.oio)
OioDatagramChannel (io.netty.channel.socket.oio)
AbstractServerChannel (io.netty.channel)
LocalServerChannel (io.netty.channel.local)
AbstractNioChannel (io.netty.channel.nio)
AbstractNioMessageChannel (io.netty.channel.nio)
NioDatagramChannel (io.netty.channel.socket.nio)
NioUdtAcceptorChannel (io.netty.channel.udt.nio)
NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)
NioSctpChannel (io.netty.channel.sctp.nio)
NioSctpServerChannel (io.netty.channel.sctp.nio)
NioServerSocketChannel (io.netty.channel.socket.nio)
NioUdtMessageConnectorChannel (io.netty.channel.udt.nio)
NioUdtMessageRendezvousChannel (io.netty.channel.udt.nio)
AbstractNioByteChannel (io.netty.channel.nio)
NioSocketChannel (io.netty.channel.socket.nio)
NioUdtByteConnectorChannel (io.netty.channel.udt.nio)
ServerChannel (io.netty.channel)
ServerSocketChannel (io.netty.channel.socket)
EpollServerSocketChannel (io.netty.channel.epoll)
OioServerSocketChannel (io.netty.channel.socket.oio)
NioServerSocketChannel (io.netty.channel.socket.nio)
ServerDomainSocketChannel (io.netty.channel.unix)
EpollServerDomainSocketChannel (io.netty.channel.epoll)
AbstractEpollServerChannel (io.netty.channel.epoll)
EpollServerDomainSocketChannel (io.netty.channel.epoll)
EpollServerSocketChannel (io.netty.channel.epoll)
SctpServerChannel (io.netty.channel.sctp)
OioSctpServerChannel (io.netty.channel.sctp.oio)
NioSctpServerChannel (io.netty.channel.sctp.nio)
AbstractServerChannel (io.netty.channel)
LocalServerChannel (io.netty.channel.local)
UdtServerChannel (io.netty.channel.udt)
NioUdtAcceptorChannel (io.netty.channel.udt.nio)
NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)
SctpChannel (io.netty.channel.sctp)
NioSctpChannel (io.netty.channel.sctp.nio)
OioSctpChannel (io.netty.channel.sctp.oio)
UnixChannel (io.netty.channel.unix)
AbstractEpollChannel (io.netty.channel.epoll)
AbstractEpollServerChannel (io.netty.channel.epoll)
EpollServerDomainSocketChannel (io.netty.channel.epoll)
EpollServerSocketChannel (io.netty.channel.epoll)
AbstractEpollStreamChannel (io.netty.channel.epoll)
EpollSocketChannel (io.netty.channel.epoll)
EpollDomainSocketChannel (io.netty.channel.epoll)
EpollDatagramChannel (io.netty.channel.epoll)
DomainSocketChannel (io.netty.channel.unix)
EpollDomainSocketChannel (io.netty.channel.epoll)
ServerDomainSocketChannel (io.netty.channel.unix)
EpollServerDomainSocketChannel (io.netty.channel.epoll)
DatagramChannel (io.netty.channel.socket)
NioDatagramChannel (io.netty.channel.socket.nio)
OioDatagramChannel (io.netty.channel.socket.oio)
EpollDatagramChannel (io.netty.channel.epoll)
DuplexChannel (io.netty.channel.socket)
DomainSocketChannel (io.netty.channel.unix)
EpollDomainSocketChannel (io.netty.channel.epoll)
AbstractEpollStreamChannel (io.netty.channel.epoll)
EpollSocketChannel (io.netty.channel.epoll)
EpollDomainSocketChannel (io.netty.channel.epoll)
SocketChannel (io.netty.channel.socket)
EpollSocketChannel (io.netty.channel.epoll)
NioSocketChannel (io.netty.channel.socket.nio)
OioSocketChannel (io.netty.channel.socket.oio)
UdtChannel (io.netty.channel.udt)
NioUdtByteConnectorChannel (io.netty.channel.udt.nio)
NioUdtByteRendezvousChannel (io.netty.channel.udt.nio)
NioUdtMessageConnectorChannel (io.netty.channel.udt.nio)
NioUdtMessageRendezvousChannel (io.netty.channel.udt.nio)
UdtServerChannel (io.netty.channel.udt)
NioUdtAcceptorChannel (io.netty.channel.udt.nio)
NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)
选几个比较常用的Channel实现类看看对应的Unsafe接口实现。
2.2.1 AbstractUnsafe
AbstractUnsafe抽象类位于AbstractChannel内部。
看下它的方法
2.2.2 AbstractEpollUnsafe
AbstractEpollUnsafe是AbstractUnsafe的子类
2.2.3 EpollServerSocketUnsafe
EpollServerSocketUnsafe是AbstractEpollUnsafe的子类