文章目录
前言
Netty是 一个异步事件驱动的网络应用程序框架, 用于快速开发可维护的高性能协议服务器和客户端。
Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。
“快速简便”并不意味着最终的应用程序会受到可维护性或性能问题的影响。Netty经过精心设计,具有丰富的协议,如FTP,SMTP,HTTP以及各种二进制和基于文本的传统协议。因此,Netty成功地找到了一种在不妥协的情况下实现易于开发,性能,稳定性和灵活性的方法。
特征
设计
适用于各种传输类型的统一API - 阻塞和非阻塞套接字
基于灵活且可扩展的事件模型,可以清晰地分离关注点
高度可定制的线程模型 - 单线程,一个或多个线程池,如SEDA
真正的无连接数据报套接字支持(自3.1起)
使用方便
详细记录的Javadoc,用户指南和示例
没有其他依赖项,JDK 5(Netty 3.x)或6(Netty 4.x)就足够了
注意:某些组件(如HTTP / 2)可能有更多要求。 有关更多信息,请参阅 “要求”页面。
性能
吞吐量更高,延迟更低
减少资源消耗
最小化不必要的内存复制
安全
完整的SSL / TLS和StartTLS支持
社区
早发布,经常发布
自2003年以来,作者一直在编写类似的框架,他仍然觉得你的反馈很珍贵!
参考链接: https://netty.io/
依赖工具
- Maven
- Git
- JDK
- IntelliJ IDEA
源码拉取
从官方仓库 https://github.com/netty/netty Fork
出属于自己的仓库。为什么要 Fork
?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。?
使用 IntelliJ IDEA
从 Fork
出来的仓库拉取代码。
本文使用的 Netty 版本为 4.1.26.Final-SNAPSHOT
。
Maven Profile
打开 IDEA 的 Maven Projects ,选择对应的 Profiles 。如下图所示:
-
jdk8
:笔者使用的 JDK 版本是 8 ,所以勾选了jdk8
。如果错误的选择,可能会报如下错误:java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer
-
linux
: 选择对应的系统版本。? 笔者手头没有 windows 的电脑,所以不知道该怎么选。
修改完成后,点击左上角的【刷新】按钮,进行依赖下载,耐心等待…
解决依赖报错
在 codec-redis
模块中,类 FixedRedisMessagePool 会报如下类不存在的问题:
import io.netty.util.collection.LongObjectHashMap;
import io.netty.util.collection.LongObjectMap;
- 具体如下图所示:
解决方式如下:
cd common;
mvn clean compile;
- 跳转到
common
模块中,编译生成对应的类。为什么可以通过编译生成对应的类呢,原因参见common
模块的src/java/templates/io/netty/util/collection
目录下的.template
文件。
在 Github 上,也有多个针对这个情况讨论的 issue :
- 《Can not find class io.netty.util.collection.LongObjectHashMap in 4.1.8.final》
- 《io.netty.util.collection.LongObjectHashMap not found at branch 4.1》
example 模块
在 example
模块里,官网提供了多个 Netty 的使用示例。
本文以 telnet
包下来作为示例。哈哈哈,因为最简单且完整。
netty-helloworld
说明: 如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。
开发准备
环境要求
- JDK: 1.8
- Netty: 4.0或以上
如果对Netty不熟的话,可以看看之前写的一些文章。大神请无视☺。
首先还是Maven的相关依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<netty-all.version>4.1.6.Final</netty-all.version>
</properties>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>