美文网首页
9 netty中Channel的类继承结构

9 netty中Channel的类继承结构

作者: 沉沦2014 | 来源:发表于2018-08-26 16:23 被阅读101次

Netty中通道是对java原生网络编程api的封装,其顶级接口是Channel。
以TCP编程为例 ,在java中,有两种方式:

  1. 基于BIO,JDK1.4之前,我们通常使用java.net包中的ServerSocketSocket来代表服务端和客户端。
  2. 基于NIO,Jdk1.4引入nio编程之后,我们使用java.nio.channels包中的ServerSocketChannelSocketChannel来代表服务端与客户端。

在Netty中,对java中的BIO、NIO编程api都进行了封装,分别:

  1. 使用了OioServerSocketChannelOioSocketChannel对java.net包中的ServerSocket与Socket进行了封装
  2. 使用NioServerSocketChannelNioSocketChannel对java.nio.channels包中的ServerSocketChannel和SocketChannel进行了封装。

Netty中TCP编程的Channel类图继承关系如下:

image.png
很容易可以看出,图中左半部分与右半部分是相互对应的:
  • 左半部分代表的是客户端:都实现了SocketChannel接口
  • 右半部分代表的是服务端:都实现了ServerChannel接口,这是一个标记接口。

特别需要注意的是,虽然Netty使用通道的概念,对java原生BIO、NIO编程api都进行了封装,但是通道的概念其实是在java 1.4之后引入nio编程才出现的,因此只有NioServerSocketChannel和NioSocketChannel才有对应的java通道,可以看到这二者都继承自AbstractNioChannel,其维护了netty中的channel与java nio中channel的对应关系,并提供了javaChannel()方法获取对应的java 中的channel:

public abstract class AbstractNioChannel extends AbstractChannel {
 ...
private final SelectableChannel ch;
 ...
 protected SelectableChannel javaChannel() {//获取对应的java通道
    return ch;
 }
}

上述代码片段中SelectableChannel是java nio中的类,我们前面提到nio包中的SocketChannel、ServerSocketChannel都是其子类

image.png
NioSocketChannel和NioServerSocketChannel对AbstractNioChannel的javaChannel()进行了覆写,如下:
io.netty.channel.socket.nio.NioServerSocketChannel#javaChannel
@Override
protected ServerSocketChannel javaChannel() {//返回java.nio.channels.ServerSocketChannel
  return (ServerSocketChannel) super.javaChannel();
}

io.netty.channel.socket.nio.NioSocketChannel#javaChannel

@Override
protected SocketChannel javaChannel() {//返回java.nio.channels.SocketChannel
    return (SocketChannel) super.javaChannel();
}

对于OioSocketChannel和OioServerSocketChannel,是直接继承自AbstractChannel,内部直接维护了对应的Socket和ServerSocket。

public class OioSocketChannel extends OioByteStreamChannel
                              implements SocketChannel {
...
private final Socket socket;
....
}
public class OioServerSocketChannel extends AbstractOioMessageChannel
                                    implements ServerSocketChannel {
...
final ServerSocket socket;
...
}

相关文章

网友评论

      本文标题:9 netty中Channel的类继承结构

      本文链接:https://www.haomeiwen.com/subject/mxpoiftx.html