项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
Netty 源码分析 —— NIO 基础(二)之 Channel
2020-12-08
·
芋道源码
·
转载
·
·
本文共 254个字,预计阅读需要 1分钟。
> 转载于【芋道源码】 ## 1. 概述 在 Java NIO 中,基本上所有的 IO 操作都是从 Channel 开始。数据可以从 Channel 读取到 Buffer 中,也可以从 Buffer 写到 Channel 中。如下图所示: ![Buffer <=> Channel](http://static.iocoder.cn/images/Netty/2018_02_05/01.png) ## 2. NIO Channel 对比 Java Stream NIO Channel **类似** Java Stream ,但又有几点不同: 1. 对于**同一个** Channel ,我们可以从它读取数据,也可以向它写入数据。而对于**同一个** Stream ,通畅要么只能读,要么只能写,二选一( 有些文章也描述成“单向”,也是这个意思 )。 2. Channel 可以**非阻塞**的读写 IO 操作,而 Stream 只能**阻塞**的读写 IO 操作。 3. Channel **必须配合** Buffer 使用,总是先读取到一个 Buffer 中,又或者是向一个 Buffer 写入。也就是说,我们无法绕过 Buffer ,直接向 Channel 写入数据。 ## 3. Channel 的实现 Channel 在 Java 中,作为一个**接口**,`java.nio.channels.Channel` ,定义了 IO 操作的**连接与关闭**。代码如下: ```java public interface Channel extends Closeable { /** * 判断此通道是否处于打开状态。 */ public boolean isOpen(); /** *关闭此通道。 */ public void close() throws IOException; } ``` Channel 有非常多的实现类,最为重要的**四个** Channel 实现类如下: - `SocketChannel `:一个客户端用来**发起** TCP 的 Channel 。 - `ServerSocketChannel `:一个服务端用来**监听**新进来的连接的 TCP 的 Channel 。对于每一个新进来的连接,都会创建一个对应的 SocketChannel 。 - `DatagramChannel `:通过 UDP 读写数据。 - `FileChannel `:从文件中,读写数据。 > 因为 [《Java NIO 系列教程》](http://ifeve.com/java-nio-all/) 对上述的 Channel 解释的非常不错,我就直接引用啦。 > > 我们在使用 Netty 时,主要使用 TCP 协议,所以胖友可以只看 「3.2 SocketChannel」和 「3.1 ServerSocketChannel」。 ### 3.1 ServerSocketChannel [《Java NIO系列教程(九) ServerSocketChannel》](http://ifeve.com/server-socket-channel/) ### 3.2 SocketChannel [《Java NIO 系列教程(八) SocketChannel》](http://ifeve.com/socket-channel/) ### 3.3 DatagramChannel [《Java NIO系列教程(十) Java NIO DatagramChannel》](http://ifeve.com/datagram-channel/) ### 3.4 FileChannel [《Java NIO系列教程(七) FileChannel》](http://ifeve.com/file-channel/) ## 彩蛋 参考文章如下: - [《Java NIO 系列教程(二) Channel》](http://ifeve.com/channels/)