Netty之服务端channel的初始化

简介: Netty之服务端channel的初始化

前言

Netty启动时初始化的的channel为什么设置为非阻塞的, 同步异步阻塞非阻塞的区别是什么?

这已经是本期活动的第六篇文章了, 浅浅看一下第一周第三个任务还没有完成, 这怎么能行呢, 必须安排一下

网络异常,图片无法展示
|


打断点开始调栈

我们从定位初始化开始, 按图找断点

在 idea 中双击Shift输入AbstractNioChannel找到他的构造函数并打断点, 然后启动我们的Netty启动类MyServer

网络异常,图片无法展示
|

从 bind() 开始

我们把我们的调用栈堆拉到最下面, 然后逐层开始查看

网络异常,图片无法展示
|

启动类执行ServerBootstrap.bind()方法

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

调用bind()方法, 然后进入重写bind()方法, 执行真正的 bind 实现doBind()方法, 这个方法我用了三篇文章带大家整体的走了一遍, 感兴趣的可以看一下我之前的文章, 我们知道initAndRegister()方法是channel的初始化和注册, 调用栈堆也确实是这么告诉我们的, 我们继续往下看

网络异常,图片无法展示
|

网络异常,图片无法展示
|

...

网络异常,图片无法展示
|

在这里执行了我们的创建channel实例的方法, 截图没放全, 太多了... 还没啥写的, 就是一堆调用方法, 最后我们进入了最终打断点的地方, 在这里将channel设置为非阻塞模式

先讲一下阻塞非阻塞和同步异步

同步: 两个或以上的线程在工作时互相协同, 比如线程B要等线程A工作结束, 拿到线程A的结果之后才能开始工作, 他俩就是同步的

异步: 还是线程A和线程B, 线程B不用等线程A的结果可以直接去工作, 就是异步的

阻塞: 被调用线程做完请求之后才返回结果, 就是阻塞的非阻塞: 被调用线程直接给出结果再去执行线程, 就是非阻塞的

同时他们还能两两组合

  • 同步阻塞:客户端发送请求给服务端, 假设服务端处理任务时间很久, 这个过程中客户端因为在等服务端回复, 所以不能做其他的事情, 同时服务端在处理客户端的请求, 也不会接受其他客户端的请求
  • 同步非阻塞:客户端发送请求给服务端,假设服务端处理这个任务时间很久,这个时候依然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵着,所以这是非阻塞的。
  • 异步阻塞:客户端发送请求给服务端,假设服务端处理任务时间很久,但是客户端不会等待服务器响应,它可以做其他的任务,等服务器处理完毕后再把结果响应给客户端,客户端得到回调后再处理服务端的响应。这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求。
  • 异步非阻塞:客户端发送请求给服务端,假设服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是异步的,可以在回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,这个模式就显得非常的高效了。
同步 异步
阻塞 客户端会等服务端处理完请求, 服务端处理完当前请求才会处理下一个请求 客户端可以执行其他任务, 服务端处理完请求回调通知给客户端, 服务端必须处理完当前请求才能继续处理下一个请求
非阻塞 客户端会等服务端处理完请求再进行其他操作, 客户端可以处理多个请求 客户端和服务端互不影响

为什么将 channel 设置为非阻塞的

经过上面同步异步阻塞非阻塞的讲解, 我们也知道了为什么要把Channel设置成非阻塞的了, 相对比来讲异步非阻塞模式是非常高效的.

总结

字数多少有点少, 万万没想到这个任务这么简单



目录
相关文章
|
3月前
|
Java Maven
【Netty 网络通信】启动通信服务端
【1月更文挑战第9天】【Netty 网络通信】启动通信服务端
|
7月前
|
存储 网络协议 前端开发
Netty服务端和客户端开发实例—官方原版
Netty服务端和客户端开发实例—官方原版
111 0
|
16天前
|
网络协议 Java 物联网
Spring Boot与Netty打造TCP服务端(解决粘包问题)
Spring Boot与Netty打造TCP服务端(解决粘包问题)
26 1
|
2月前
|
安全 Java Go
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
70 0
|
3月前
|
测试技术
Netty4 websocket 开启服务端并设置IP和端口号
Netty4 websocket 开启服务端并设置IP和端口号
66 0
|
3月前
|
缓存 Java API
【Netty 网络通信】Channel 接口解析
【1月更文挑战第9天】【Netty 网络通信】Channel 接口解析
|
3月前
|
前端开发 Java Maven
【Netty 网络通信】启动客户端连接服务端实现通信
【1月更文挑战第9天】【Netty 网络通信】启动客户端连接服务端实现通信
|
6月前
|
Web App开发 监控 数据可视化
可视化Netty channel的工具
可视化Netty channel的工具
118 0
|
9月前
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
100 0
|
9月前
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
191 0