Netty 是由 Trustin Lee 提供的一个 Java 开源框架,现为 GitHub 上的独立项目。Netty 是一个基于 NIO 的客户、服务器端的编程框架。
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。
Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位。
以下框架都是用了 Netty ,它们都有网络通信需求!
开发一个简单的服务器和客户端
1、netty 依赖
<dependency>
<groupId>io.nettygroupId>
<artifactId>netty-allartifactId>
<version>4.0.42.Finalversion>
dependency>
2、日志依赖:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.12version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.7version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-slf4j-implartifactId>
<version>2.9.1version>
dependency>
3、log4j2.xml 文件配置
<configuration status="INFO" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%date{HH:mm:ss} [%-5level] [%thread] %logger{17} - %m%n"/>
console>
<RollingFile name="logfile" fileName="G:/Typora/Netty/Netty/logs/system.log" filePattern="G:/Typora/Netty/Netty/logs/$${date:yyyy-MM}/system-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%date{HH:mm:ss} [%-5level] [%thread] %logger{17} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="50 MB"/>
Policies>
<DefaultRolloverStrategy compressionLevel="0" max="10"/>
RollingFile>
appenders>
<loggers>
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="Console" />
logger>
<root level="ERROR">
<appender-ref ref="Console" />
root>
loggers>
configuration>
public class HelloServer {
public static void main(String[] args) {
// 1、服务端启动器,负责组装 netty 组件,启动服务器
new ServerBootstrap()
// 2、BossEventLoop WorkerEventLoop(包含selector, Thread), group 组
.group(new NioEventLoopGroup())
// 3、选择 服务器的 ServerSocketChannel 实现 (EpollServerSocketChannel、OioServerSocketChannel)
.channel(NioServerSocketChannel.class)
// 4、boss负责处理连接 worker(child)负责处理读写。决定 worker(child) 能执行哪些操作(handler)
.childHandler(
// 5、Channel 代表和客户端进行数据读写的通道;Initializer 初始化,负责添加别的 handler
new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
// 6、添加具体的 handler
// 将 ByteBuf 转换为字符串
nioSocketChannel.pipeline().addLast(new StringDecoder());
// 自定义 handler
nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override // 读事件
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 打印上一步转换好的字符串
System.out.println(msg);
}
});
}
})
// 7、绑定监听端口
.bind(8888);
}
}
public class HelloClient {
public static void main(String[] args) throws InterruptedException {
// 1、客户端启动器
new Bootstrap()
// 2、添加 EventLoop
.group(new NioEventLoopGroup())
// 3、选择客户端 Channel 事件
.channel(NioSocketChannel.class)
// 4、添加处理器,
.handler(new ChannelInitializer<NioSocketChannel>() {
@Override // 连接建立后被调用
protected void initChannel(NioSocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
}
})
// 5、连接到服务器
.connect(new InetSocketAddress("localhost", 8888))
.sync()
.channel()
// 6、向服务器发送数据
.writeAndFlush("hello, world");
}
}
