Netty三大核心组件之Channel

左手的ㄟ右手 2023-06-18 09:58 73阅读 0赞

所有的 NIO 操作始于通道,通道是数据来源或数据写入的目的地,主要地,我们将关心 java.nio 包中实现的以下几个 Channel:

format_png

FileChannel:文件通道,用于文件的读和写。

DatagramChannel:用于UDP连接的接收和发送

SocketChannel:TCP客户端

ServerSocketChannel:TCP服务端,监听某个端口进来的请求。

Channel 经常翻译为通道,类似 IO 中的流,用于读取和写入。它与前面介绍的 Buffer 打交道,读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。

format_png 1

format_png 2

SocketChannel

打开一个TCP链接:








1

SocketChannel socketChannel = SocketChannel<br>  .open(new InetSocketAddress(“127.0.0.1”, 80));

当然了,上面的这行代码等价于下面的两行:








1

2

3

4

// 打开一个通道

SocketChannel socketChannel = SocketChannel.open();

// 发起连接

socketChannel.connect(new InetSocketAddress(“127.0.0.1”, 80));

SocketChannel 的读写和 FileChannel 没什么区别,就是操作缓冲区。








1

2

3

4

5

6

7

// 读取数据

socketChannel.read(buffer);

 

// 写入数据到网络连接中

while(buffer.hasRemaining()) {

    socketChannel.write(buffer);  

}

ServerSocketChannel

ServerSocketChannel 用于监听机器端口,管理从这个端口进来的 TCP 连接。








1

2

3

4

5

6

7

8

9

// 实例化

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

// 监听 8080 端口

serverSocketChannel.socket().bind(new InetSocketAddress(8080));

 

while (true) {

    // 一旦有一个 TCP 连接进来,就对应创建一个 SocketChannel 进行处理

    SocketChannel socketChannel = serverSocketChannel.accept();

}

这里我们看到了SocketChannel的第二个实例化方式。

到这里,我们应该能理解SocketChannel了,它不仅仅是TCP客户端,它代表的是一个网络通道,可读可写。

ServerSocketChannel不和Buffer打交道了,因为它并不实际处理数据,一旦接到请求,就会实例化一个SocketChannel,之后再这个简介通道上传递的数据它就不管了,它会继续监听端口等待下一个连接。

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Netty 核心组件

    Netty 核心组件 1. 前言 本节我们主要从整体上了解 Netty 有哪些核心组件,很多同学学习完 Netty 虽然会使用,但是只知道如何自定义 Handler

    相关 Netty核心组件

    Netty的核心组件   Channel   回调   Future   事件   ChannelHandler   这些模块代表了不同的类型:资源(事件)、逻