传
API
核心是 Channel
classDiagram interface Comparable interface AttributeMap interface Channel interface ServerChannel interface ChannelPipeline interface ChannelConfig class AbstractChannel Comparable <|-- Channel AttributeMap <|-- Channel Channel <|.. ServerChannel ChannelPipeline <|..* Channel ChannelConfig <|..* Channel Channel <|-- AbstractChannel
Channel的方法
方法名 | 描述 |
---|---|
eventLoop | 返回分配给Channel 的EventLoop |
pipeline | 返回分配给Channel 的ChannelPipeline |
isActive | 如果Channel 是活动的,则返回true 。活动的意义可能依赖于底层的传输。例如,一个Socket 传输一旦连接到了远程节点便是活动的,而一个Datagram 传输一旦被打开便是活动的 |
localAddress | 返回本地的SocketAddress |
remoteAddress | 返回远程的SocketAddress |
write | 将数据写到远程节点。这个数据将被传递给ChannelPipeline ,并且排队直到它被flush |
flush | 将之前已写的数据刷新到底层传输,如一个Socket |
writeAndFlush | 一个简便的方法,等同于调用write() 并接着调用flush() |
Channel 是线程安全的
内置的传输方式
名称 | 包 | 描述 | 使用场景 |
---|---|---|---|
NIO | io.netty.channel.socket.nio | 使用java.nio.channels 包作为基础----基于选择器的方式 | 需要非阻塞的情况下(常用) |
Epoll | io.netty.channel.epoll | 由JNI驱动的epoll() 和非阻塞IO。这个传输支持只有在Linux上可用的多种特性,如SO_REUSEPORT ,比NIO传输更快,而且是完全非阻塞 | 同上 |
OIO | io.netty.channel.socket.oio | 使用java.net 包作为基础----使用阻塞流 | 需要阻塞传输的情况下 |
Local | io.netty.channel.local | 可以在VM内部通过管道进行通信的本地传输 | 在同一个JVM内部 |
Embedded | io.netty.channel.embedded | Embedded传输,允许使用ChannelHandler 而又不需要一个真正的基于网络的传输 | 测试ChannelHandler 时 |
在实际生产环境中,只推荐使用 NIO 了,Epoll 也是NIO, 是 Netty 自己单独实现的,性能称比 Linux 自带的好
NIO
Epoll
该传输的语义同NIO 如果要使用该传输 只需要将 EventLoop 中的 NioServerSocketChannel 替换为 EpollServerSocketChannel即可
OIO
更熟悉的名字叫做 BIO
Local
没有绑定物理网络地址
Embedded
可以将一组ChannelHandler 嵌入到 其他 ChannelHandler内部