一、什么是Netty
Netty官网上是这样定义Netty的:
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.
用人话(Google翻译)的话来说就是:
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务端和客户端。
简单来说,Netty有以下特点:
- 设计:适用于不同的协议(阻塞和非阻塞);可定制的线程模型;
- 性能:更好的吞吐量、低延迟;省资源;减少不必要的内存拷贝;提供的Reactor线程模型能够做到高效的并发处理;
- 安全:完整的SSL/TLS和STARTTLS支持;
- 易用:封装了JDK的NIO,大大简化NIO编程;并且自带粘包拆包。异常检测等机制;
- 应用:在消息中间件、分布式通信框架中有很好的应用和验证(Dubbo默认使用Netty作为基础通信框架);
二、Netty入门demo
本节将通过搭建一个语音机器人的demo来了解Netty的用法,实现的主要功能为:客户端发送查询指令,服务端根据通过Netty框架接收到指令后做出响应,并在客户端显示。
首先导入Netty需要的依赖,本次使用的是4.x版本:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
</dependency>
服务端
首先是服务端的搭建。服务端的作用是接收客户端命令并处理命令,做出响应。整个流程如下:
- 创建两个NioEventLoopGroup实例,一个用来接受客户端的连接;另一个用来进行SocketChannel读写;
- 创建ServerBootstrap,用于启动NIO服务端的辅助启动类;
- 调用创建ServerBootstrap的group方法,将两个NioEventLoopGrou作为参数传入;
- 创建NioServerSocketChannel,并设置TCP参数,将backlog设置为1024(服务端在接收客户端的TCP连接的时候,同一时间只能处理一个,多了会将请求放在队列里,backlog指定了队列大小);
- 绑定ChildChanelHandler,创建pipeline, 处理网络I/O事件、消息编解码等;
- 线程组阻塞、关闭;
/**
* Created by wanggenshen
* Date: on 2019/5/16 00:49.
* Description: 机器人服务端, 用于接收指令, 并对指令作出新响应
*/
public class RobotServer {
public static void bind(int port) throws InterruptedException {
// 用于服务端接受客户端连接
EventLoopGroup parentGroup = new NioEventLoopGroup();
// 用于进行SocketChannel的网络读写
EventLoopGroup workGroup = new NioEventLoopGroup();
try {
// 启动NIO服务端辅助启动类
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(parentGroup, workGroup)
.channel(NioServerSocketChannel.class)
.option(Channe