
(傅哥的谆谆教诲)
Java 目前有三种IO共存;分别是 BIO、NIO 和 AIO
BIO : 面向流 一个字节输入一个字节输出 NIO : 面向缓冲区;
补充: IO 的四种模型 BIO、NIO、AIO、多路复用
按照傅哥的例子写了两个IO的操作 AIO 和 BIO , 之前自己用 NIO 写过一个 reactor 主从多线程的模式. 所以没有继续去写 NIO 的代码
写下来发现傅哥他从第一行代码开始就将整个架构的思想放了进去. 包括抽象的 适配器与通道的处理器 channelhandler. 思想领会了 即开闭原则, 这里用到了模板方法设计模式, 定制了规范, 不同的处理器由自己去实现.
整体感觉代码较复杂 , 可扩展性较好. 入门学习难度 128 颗星.
总结:
接触到Netty之后发现, 原来傅哥从一开始就想着用Netty的思路来进行代码编写案例教程 此时竖起大拇指.
傅哥英语不怎么样, bing. emm…
public static void main(String[] args) {
new NettyServer().bing(7397);
}
private void bing(int port) {netty 正式开始, 这里为了学习效率, 使用的为源码包. 直接拉的netty github 4.1 的分支代码
这里有个比较有意思的事情, 就是netty源码拿下来运行时发现少个包
import io.netty.util.collection.IntObjectMap;
当然最后来发现这个包是在编译期使用groovy脚本生成的
a-source-code/netty4.1/common/src/main/script/codegen.groovy
使用.java的源码netty, 然后根据傅哥的代码下来, 程序正常执行. 日志正常输出
链接报告开始
链接报告信息:有一客户端链接到本服务端
链接报告IP:192.168.30.32
链接报告Port:2333
链接报告完毕傅哥前面的大篇幅代码没解释有点难受
链接报告开始
链接报告信息:有一客户端链接到本服务端
链接报告IP:192.168.30.32
链接报告Port:2333
链接报告完毕
Wed Sep 23 14:40:22 CST 2020接收到消息:1111
Wed Sep 23 14:40:24 CST 2020接收到消息:1111
Wed Sep 23 14:40:25 CST 2020接收到消息:1111
Wed Sep 23 14:40:27 CST 2020接收到消息:1111管道初始化, 管道处理器 建立连接的时候插根管子在两个 Socket 上 (客户端----服务端)?
本篇主题: netty4.1基础入门篇三《NettyServer字符串解码器》
Lvgo-链接报告IP:192.168.30.32
Lvgo-链接报告Port:2333
链接报告开始 {公众号:bugstack虫洞栈 >获取学习源码}
链接报告信息:有一客户端链接到本服务端
链接报告IP:192.168.30.32
链接报告Port:2333
链接报告完毕
Wed Sep 23 15:40:24 CST 2020接收到消息:lvgorice@gmai.com定长报文解码器
"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=59635:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=GBK -classpath "C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;F:\7MI\lvgo-blog-code\network-programming\target\classes;F:\7MI\lvgo-blog-code\source-code\netty\transport\target\classes;F:\7MI\lvgo-blog-code\source-code\netty\common\target\classes;F:\7\erayt-maven-repo\org\jctools\jctools-core\3.1.0\jctools-core-3.1.0.jar;F:\7MI\lvgo-blog-code\source-code\netty\buffer\target\classes;F:\7MI\lvgo-blog-code\source-code\netty\resolver\target\classes;F:\7MI\lvgo-blog-code\source-code\netty\codec\target\classes;F:\7\erayt-maven-repo\org\openjdk\jol\jol-core\0.10\jol-core-0.10.jar" cc.lvgo.netty4x.netty_basics.netty103.server.NettyServer
2333 端口已开启, 造作中....
Lvgo-链接报告IP:192.168.30.32
Lvgo-链接报告Port:2333
链接报告开始 {公众号:bugstack虫洞栈 >获取学习源码}
链接报告信息:有一客户端链接到本服务端
链接报告IP:192.168.30.32
链接报告Port:2333
链接报告完毕
Wed Sep 23 15:50:54 CST 2020接收到消息:lvgorice@gmai.com
Wed Sep 23 15:50:56 CST 2020接收到消息:1lvgorice@gmai.co
Wed Sep 23 15:50:57 CST 2020接收到消息:m1lvgorice@gmai.c
Wed Sep 23 15:50:58 CST 2020接收到消息:om1lvgorice@gmai.
Wed Sep 23 15:50:58 CST 2020接收到消息:com1lvgorice@gmai
Wed Sep 23 15:50:58 CST 2020接收到消息:.com1lvgorice@gma
Wed Sep 23 15:50:58 CST 2020接收到消息:i.com1lvgorice@gm
Wed Sep 23 15:50:58 CST 2020接收到消息:ai.com1lvgorice@gio/netty/bootstrap/ServerBootstrap#channelRead{child.pipeline().addLast(childHandler);} 第一根管道就是我们配置在启动器上的childHandler
而后的内容目前仍理解为一根根管子继续在后面接
本章节主要介绍服务端在收到数据后,通过writeAndFlush发送ByteBuf字节码向客户端传输信息。 因为我们使用客户端模拟器的编码是GBK格式,所以代码中也需要将字节码转换为GBK,否则会乱码
2333 端口已开启, 造作中....
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
死循环开启事件选择器. 监控事件发生 ----strategy : 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 16
通道初始化完成...
基于换行符解码
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
链接报告信息:有一客户端链接到本服务端
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......本章节我们使用new StringEncoder(Charset.forName(“GBK”))进行进行字符串编码,用以实现服务端在发送数据的时候只需要传输字符串内容即可。
基于换行符解码
链接报告信息:有一客户端链接到本服务端
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
死循环开启事件选择器. 监控事件发生 ----strategy : 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
Wed Sep 23 21:50:16 CST 2020接收到消息:lvgorice@gmail.com
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器在微信或者QQ的聊天中我们经常会用到一些群聊,把你的信息发送给所有用户。 那么为了实现群发消息,在netty中我们可以使用ChannelGroup方式进行群发消息。 如果为了扩展验证比如你实际聊天有不同的群,那么可以定义ConcurrentHashMap结构来存放ChannelGroup。ChannelGroup中提供了一些基础的方法;添加、异常、查找、清空、发放消息、关闭等。
ChannelGroup 通道组? 把连接进来的 SocketChannel 放到组里, 然后通过 循环遍历将消息发送给不同的 SocketChannel ?
死循环开启事件选择器. 监控事件发生 ----strategy : 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
Wed Sep 23 22:20:08 CST 2020接收到消息:lvgorice@gmail.com
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
死循环开启事件选择器. 监控事件发生 ----strategy : 0
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
死循环开启事件选择器. 监控事件发生 ----strategy : 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
客户端断开链接/192.168.232.1:12177
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......
死循环开启事件选择器. 监控事件发生 ----strategy : 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
客户端断开链接/192.168.232.1:12178
io/netty/channel/nio/NioEventLoop.java:447 死循环事件选择器阻塞中......netty 的客户端. 之前一直都在使用模拟器与我们的服务端进行连接. netty 的客户端还一直都没有接触到.
连接成功, 通道 ID : 685fac28
死循环事件选择器阻塞轮询中...... io/netty/channel/nio/NioEventLoop.java:447
发生事件 ---- strategy = 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 8
执行到这里表示已经连接成功了
死循环事件选择器阻塞轮询中...... io/netty/channel/nio/NioEventLoop.java:447 connect.channel().closeFuture().sync(); 这一步代码究竟干了什么???
本章节涉及到的知识点有;LineBasedFrameDecoder、StringDecoder、StringEncoder、ChannelInboundHandlerAdapter等。
连接成功, 通道 ID : 4c678cfc
死循环事件选择器阻塞轮询中...... io/netty/channel/nio/NioEventLoop.java:447
发生事件 ---- strategy = 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 8
执行到这里表示已经连接成功了
死循环事件选择器阻塞轮询中...... io/netty/channel/nio/NioEventLoop.java:447
发生事件 ---- strategy = 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
死循环事件选择器阻塞轮询中...... io/netty/channel/nio/NioEventLoop.java:447
发生事件 ---- strategy = 1
选择器事件处理过程
io/netty/channel/nio/NioEventLoop.java:698 事件行动值 : 1
断开连接/127.0.0.1:8080ByteToMessageDecoder、MessageToByteEncoder;
案例采用 02, 03 标识进行分包
还么开始, 我的问题就出现了. 在客户端或服务端, 均出现了编码通道和解码通道, 这是什么意思 难道不是服务端发送的时候编码, 接收的时候解码. 区分开来吗? 放在一起? 怎么区分?? 难道说根据 这节通道的内容有选择的执行? channel通道跳跃??
没跑通ChannelOutboundHandlerAdapter, 终于到了前面有疑惑的地方了.
2333 端口已开启, 造作中....
链接报告信息:有一客户端链接到本服务端/127.0.0.1:2689
Fri Sep 25 00:19:40 CST 2020接收到消息:乌拉踏踏
Fri Sep 25 00:19:40 CST 2020接收到消息:I'm coming
Fri Sep 25 00:19:40 CST 2020接收到消息:德玛西亚注意:入站事件在 ChannelPipeline 双向链表中由头到尾正向传播,出站事件则方向相反。 当客户端连接到服务器时,Netty 新建一个 ChannelPipeline 处理其中的事件,而一个 ChannelPipeline 中含有若干 ChannelHandler 。 如果每个客户端连接都新建一个 ChannelHandler 实例,当有大量客户端时,服务器将保存大量的ChannelHandler实例。 为此,Netty提供了Sharable注解,如果一个 ChannelHandler 状态无关,那么可将其标注为Sharable,如此,服务器只需保存一个实例就能处理所有客户端的事件。
这一节内容比较靠近原理. 包括之前疑问的几个点也有涉及, 比如 ChannelOutboundHandler , 一个出站事件拦截和处理处理器. 对于出站入站的概念还是有点模糊. 不是很清楚, 还需要打磨.
Netty 的 UDP 使用, DataGram
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 [1] 描述了 UDP。 Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
2020-09-25 11:17:48 UDP服务端接收到消息:你好端口7397的bugstack虫洞栈,我是客户端小爱,你在吗!
2020-09-25 11:17:48 UDP客户端接收到消息:微信公众号:bugstack虫洞栈,通知:我已经收到你的消息Netty不仅可以搭建Socket服务,也可以搭建Http、Https服务。本章节我们通过一个简单的入门案例,来了解Netty搭建的Http服务,在我们后续的Netty网关服务中会使用到这样的功能点。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
在后端开发中接触HTTP协议的比较多,目前大部分都是基于Servlet容器实现的Http服务,往往有一些核心子系统对性能的要求非常高,这个时候我们可以考虑采用NIO的网络模型来实现HTTP服务,以此提高性能和吞吐量,Netty除了开发网络应用非常方便,还内置了HTTP相关的编解码器,让用户可以很方便的开发出高性能的HTTP协议的服务,Spring Webflux默认是使用的Netty。