写在前面:
Netty是Java的网络编程框架,既然是框架的学习,不免会碰到很多分支的知识和不熟悉的名词。这就需要不断的做“下潜”,耐心搜索,不求甚解,等到大致熟悉之后再去逐一深究。因此有些概念作者也不能做出详细解释,请参考贴出的相关文章或自行搜索以解决疑惑。
什么是Netty
网上很多文章都有作解释。以作者的使用体验来说,Netty是封装了 Java socket nio 来进行网络编程的工具。说到网络编程,大二软工的软件工程实训就有这个小课题,当时作者是用Java socket io来写,还没用到nio呢,就是参照网上的例子手动模拟通信过程,自己用最简单的 阻塞I/O 的模式写了一个Thread类来处理所有不同种类的请求,由于需求简单,尚能完成。 想要模拟效果更自然一点就要用 非阻塞I/O 模式,而nio就是用来写非阻塞I/O的api。但是nio的编写对java程序员是有比较高的要求的。Netty就可以简化这一系列操作。
预备知识
贴几个比较靠谱的博客,不求甚解,大致了解一下就好。
关于NIO:
https://www.jianshu.com/p/3cec590a122f (推荐,也包括I/O模型)
https://my.oschina.net/andylucc/blog/614295
关于I/O模型:
https://segmentfault.com/a/1190000003063859
开发环境
java JDK1.8 + IDEA + maven + Netty 4.1.6
maven依赖:1
2
3
4
5<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
</dependency>
实现功能
C/S通信:C是客户端,S是服务端。在IDEA控制台开启服务端接收客户端的信息String, 并返回一个“hi!”+String,客户端收到服务端的信息后在控制台上输出。
代码讲解
分为服务端和客户端两部分,各自又有一个处理连接逻辑的代码
服务端代码
1 | import io.netty.bootstrap.ServerBootstrap; |
注意这一段代码:
这是关键所在,其余代码基本上是套路代码,按部就班写就可以。
关键在于此处出现了:
- 用ChannelPipeline引用了SocketChannel的pipeline,原因在于ChannelPipeline是用于存放ChannelHandler的容器,而接下来的解码编码操作和自定义的逻辑处理类都要涉及到ChannelHandler的子类
它们之间的关系可以用下图表示:

Encoder(编码器)和Decoder(解码器),属于Codec框架的内容,大致意思是:此处描述了服务端和客户端之间传输了什么类型的数据,这里要传输String就用到了StringDecoder/Encode 当然也可以传输其他类型的数据,详情参考这篇博客:https://www.jianshu.com/p/fd815bd437cd
注释5.处的EchoServerHandler是自定义的类,可以看作是一种“规则”,规定了服务端以什么方式处理客户端发来的数据。
服务端处理连接的代码
1 | import java.net.InetAddress; |
客户端代码
1 | import io.netty.bootstrap.Bootstrap; |
客户端和服务端代码样式基本一致,有几个关键点都已注释
此处以不断向客户端发送信息,输入“quit”终止连接。
运行效果
先运行服务端再运行客户端
服务端:
客户端1:
客户端2:
参考文章