<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.90.Final</version>
</dependency>
Netty是一个高性能的网络编程框架,它提供了一种简单、高效的方式来开发可扩展的网络应用程序。Netty的底层实现主要基于Java NIO(New I/O)的非阻塞事件驱动模型。
在底层,Netty通过以下几个核心组件实现了高性能的网络通信:
- Channel(通道):Channel是Netty的核心抽象,它表示一个开放的连接,可以执行读取、写入和关闭等操作。Netty中的Channel提供了异步的I/O操作和事件通知机制。
- EventLoop(事件循环):EventLoop是Netty中的事件处理机制,它负责处理和分发事件,以及执行对应的I/O操作。每个Channel都关联了一个EventLoop,它负责处理该Channel上的所有事件。
- ChannelPipeline(通道管道):ChannelPipeline是Netty中的处理器链,它由一系列的处理器组成,用于处理、转换或拦截事件和数据。每个Channel都有自己的ChannelPipeline,事件在Pipeline中依次经过处理器进行处理。
- ChannelHandler(通道处理器):ChannelHandler是Netty中的处理器,用于执行实际的业务逻辑。它可以处理事件、读取和写入数据,以及修改ChannelPipeline。
- ByteBuf(字节缓冲区):ByteBuf是Netty中的字节容器,它提供了高效的字节操作方法,用于读取和写入数据。
Netty的底层实现利用了Java NIO的非阻塞I/O模型,通过Selector轮询事件,将I/O操作异步化并交给EventLoop处理。这种事件驱动的模型使得Netty能够处理大量并发连接,同时提供低延迟和高吞吐量的网络通信。
Netty的基本使用步骤如下:
- 引入Netty依赖:在你的项目中添加Netty的依赖项。你可以在构建工具(如Maven或Gradle)的配置文件中添加相应的依赖项,以便从中央仓库下载Netty库。
- 创建ServerBootstrap(服务器端)或Bootstrap(客户端)实例:根据你的应用类型创建相应的引导类实例。ServerBootstrap用于创建服务器端应用程序,而Bootstrap用于创建客户端应用程序。
- 配置引导类:通过设置相关选项和属性来配置引导类。这包括设置监听端口、添加处理器、设置事件循环组等。
- 添加ChannelHandler(通道处理器):创建并添加你的自定义ChannelHandler到ChannelPipeline中。这些处理器将处理传入和传出的数据,并执行特定的业务逻辑。
- 绑定端口(服务器端)或连接远程主机(客户端):如果你的应用程序是服务器端,使用ServerBootstrap绑定指定的端口;如果是客户端,使用Bootstrap连接远程主机。
- 监听事件和执行操作:在引导类启动后,你可以通过监听事件并执行相应的操作来处理数据、连接、断开连接等。这可以通过ChannelHandler中的回调方法来实现。
- 关闭应用程序:在合适的时机,调用相应的方法关闭引导类,以释放资源并关闭应用程序。
package com.jjj.ddda;
import java.util.Date;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
/**
* @Auther: TianWei_18811580953
* @Date: 2023/8/21 - 08 - 21 - 12:17
* @Description: com.jjj.ddda
* @version: 1.0
*/
public class testaab {
public static void main(String[] args) {
// 创建事件循环组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 创建ServerBootstrap实例
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast((ChannelHandler) new MyChannelHandler());
}
});
// 绑定端口并启动服务器
ChannelFuture future = serverBootstrap.bind(8080).sync();
// 阻塞直到服务器关闭
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
// 关闭事件循环组
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
在initChannel()
方法中,我们添加了一个自定义的ChannelHandler(MyChannelHandler
),用于处理传入的数据。