首页 > 编程语言 >Netty网络编程-服务端启动问题总结

Netty网络编程-服务端启动问题总结

时间:2022-08-30 10:24:51浏览次数:64  
标签:Netty NioServerSocketChannel 初始化 ChannelPipeline 编程 实例 注册 服务端

1、Netty ServerSocktChannel是如何初始化和注册的

img

  1. 获取NioServerSocketChannel的实例,构造方法中还会做以下操作:

    1. 通过SelectorProvider获取ServerSocketChannel。
    2. 设置ServerSocketChannel为非阻塞。
    3. 为此Channel生成内部唯一Id。
    4. 初始化Netty内部Unsafe类实例。
    5. 初始化ChannelPipeline实例。
    6. 初始化ServerSocketChannelConfig实例。
  2. 初始化NioServerSocketChannel的属性

    1. 设置NioServerSocketChannel的Option
    2. 设置NioServerSocketChannel的Attribute,使用的是netty自封装的AttributeMap
    3. 设置NioServerSocketChannel属性ChannelPipeline的ChannelHandler,自定义的Handler
    4. 设置NioServerSocketChannel属性ChannelPipeline的ChannelHandler,添加ServerBootstrapAcceptor
  3. NioServerSocketChannel注册到选择器上

    1. bossGroup中的每个NioEventLoop都有一个selector
    2. 获取bossGroup其中的一个NioEventLoop将此channel注册到选择器

img

img

2、Netty如何处理客户端连接

NioServerSocketChannel是注册到bossGroup中的一个NioEventLoop上的。NioEventLoop会轮训Selector获取事件,根据设置的感兴趣的事件做出相应的处理。例如连接事件。

  1. 轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
  2. 处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到WorkerGroup 中某个线程上的 Selector 上
  3. 再去以此循环处理任务队列中的下一个事件

img

img

3、ChannelPipeline中的Handler是何时初始化

NioServerSocketChannel中的ChannelPipeline初始化是在NioServerSocketChannel注册到bossGroup时触发的。

NioSocketChannel的ChannelPipeline初始化是在NioServerSocketChannel注册到childGroup时触发的。

因为首先ChannelPipeline使用的ChannelInitializer添加,所以触发注册事件首先会走到ChannelInitializer.channelRegistered方法,此方法会初始化ChannelPipeline定义的handler,结束后ChannelPipeline将移除自定义的ChannelInitializer实例。

img

img

4、ChannelPipeline中的Handler为什么要New而不能使用同一个实例

不使用@ChannelHandler.Sharable注解,Handler是无法在多个NioSocketChannel中共享的。

img

img

5、Netty如何将accept的连接交给childGroup

初始化NioServerSocketChannel的属性时,设置了NioServerSocketChannel的ServerBootstrapAcceptor,这是个handler,连接入站会处理连接,并分发到childGroup

img

img

标签:Netty,NioServerSocketChannel,初始化,ChannelPipeline,编程,实例,注册,服务端
From: https://www.cnblogs.com/Nilekai/p/16638382.html

相关文章

  • Java并发编程总结
    ——《Java多线程编程实战指南》学习及其他参考博客总结串行、并行、并发(1)串行:顺序执行多个任务,一个时刻只有一个任务在执行(2)并行:多个CPU(核)同一时间多个任务,一个时......
  • C专家编程 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1hVcsEDc3pTqBwohi69nkuA点击这里获取提取码《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基......
  • 编程语言介绍
    1.编程语言分类1.1机器语言机器语言是指用0101110这种二进制的方式编写程序和计算机进行沟通这种方式有以下几个特点:1.执行效率最高编写的程序可以被计算机无障碍......
  • 13模块化编程
    1<!doctypehtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"6content="width=device-width,user-sca......
  • 为什么 .NET应用推荐使用 await、async异步编程?
    前言 1、什么是async/await?await和async是.NETFramework4.5框架、C#5.0语法里面出现的技术,目的是用于简化异步编程模型。2、async和await的关系?async和await是成对......
  • C++【多线程编程】之【线程安全】
    1.线程安全是什么?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。2.什么情况......
  • APICloud 可视化编程 - 拖拉拽实现专业级源码
    低代码开发平台是无需编码(0代码或⽆代码)或通过少量代码就可以快速生成应用程序的开发平台。它的强⼤之处在于,允许终端⽤户使⽤易于理解的可视化⼯具开发自己的应用程......
  • Netty客户端使用以及重连
    Netty客户端使用以及重连1.pom依赖<dependency><groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.30.Final</version></dependen......
  • C# 处理TCP数据的类(服务端)
    1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Net;4usingSystem.Net.Sockets;5usingSystem.Text;6usingSystem.Threading;......
  • 三种编程命名规则(匈牙利法,小驼峰法,大驼峰法)
    1.匈牙利命名:开头字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,要求单词第一个字母大写。Forexample:longlsum=0;"l"是类型的缩写; 2.小驼峰式:(little......