Netty Channel 详解

这篇具有很好参考价值的文章主要介绍了Netty Channel 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

优质博文:IT-BLOG-CN

一、Netty 服务端启动过程

【1】创建服务端Channel
【2】初始化服务端Channel
【3】注册Selector
【4】端口绑定:我们分析源码的入口从端口绑定开始,ServerBootstrapbind(int inetPort)方法,实际上是AbstractBootstrapbind(int inetPort)方法。ServerBootstrap继承了AbstractBootstrap

二、分析服务端创建Channel的过程

【1】bind()【分析入口,端口绑定】在bind()方法中,有一个doBind()方法,处理端口绑定:

public ChannelFuture bind(SocketAddress localAddress) {
    validate();
    if (localAddress == null) {
        throw new NullPointerException("localAddress");
    }
    return doBind(localAddress);// 实际绑定
}

【2】在doBind()方法中,调用initAndRegister来处理初始化和注册:

private ChannelFuture doBind(final SocketAddress localAddress) {
    final ChannelFuture regFuture = initAndRegister();// 初始化与注册
    // ...
}

【3】initAndRegister()【初始化并注册】进入initAndRegister()方法里面,发现是调用了channelFactory(Channel工厂) 的newChannel()来创建channel

final ChannelFuture initAndRegister() {
    Channel channel = null;
    try {
        channel = channelFactory.newChannel();// channelFactory创建Channel
        init(channel);
    }
    //...
}

【4】newChannel()【创建服务端channel】进去newChannel()方法,就能看到,实际上是通过反射Class.newInstance()来创建Channel对象的:

public T newChannel() {
    try {
        return clazz.newInstance();// Channel工厂通过反射,来创建Channel
    } catch (Throwable t) {
        throw new ChannelException("Unable to create Channel from class " + clazz, t);
    }
}

那么,这个class到底是啥呢,什么时候传递进来的?

【5】ChannelFactory的初始化:【接收服务端ChannelClass,通过反射生成Channel】还记得之前我们的第一个Demo里面有一个channel()方法,我们传递了一个参数NioServerSocketChannel.class

ServerBootstrap serverBoot = new ServerBootstrap();
serverBoot.group(bossGroup,workGroup)
        .channel(NioServerSocketChannel.class)// 设置服务端Channel
        //...
);

进去channel()方法中:

public B channel(Class<? extends C> channelClass) {
    if (channelClass == null) {
        throw new NullPointerException("channelClass");
    }
    return channelFactory(new ReflectiveChannelFactory<C>
        (channelClass));// 传递class给ChannelFactory的构造方法
}

然后,我们进去ChannelFactory的构造方法里面:

public ReflectiveChannelFactory(Class<? extends T> clazz) {
    if (clazz == null) {
        throw new NullPointerException("clazz");
    }
    this.clazz = clazz;// 接收传递进来的Channel的Class
}
@Override
public T newChannel() {
    try {
        return clazz.newInstance();// 通过Channel的Class反射生成Channel对象
    } catch (Throwable t) {
        throw new ChannelException("Unable to create Channel from class " + clazz, t);
    }
}

到此,Channel的创建过程就出来了,一句话总结就是:通过我们在ServerBootstrapchannel(clazz)方法里面设置的Class,通过Java反射,Class.newInstance来生成最终的Channel对象。文章来源地址https://www.toymoban.com/news/detail-784381.html

到了这里,关于Netty Channel 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么?MC服务器又遇到了io???!!!(io.netty.channel.AbstractChannel问题分析与解决)

    当我正在期待地打开我自己搭建的MC服务器时 一点~!!! 几十秒钟的等待后,出现了IO!当然这里并不是IO接口,而是我对他的简称: io.netty.channel.AbstractChannel$AnnotatedConnectException:Connection timed out:no further information 这种错误我一看,我心都凉了,前面什么$什么io什么netty我都不管

    2024年02月05日
    浏览(84)
  • 【运维知识进阶篇】zabbix5.0稳定版详解1(安装+部署+添加服务器+拆分数据库)

    本篇文章介绍zabbix监控,监控是对我们操作系统进行不间断的监控,这是软件生命周期非常重要的一环,可以做到事前告警,事后根据监控内容排查问题(金丝雀,监控重要指标),有问题的时候,运维需要管理运维债务(在软件开发过程中积累的一些技术债务) 目录 监控

    2024年02月04日
    浏览(44)
  • 【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

    数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用,几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互,即 JDBC(Java 数据库连接)。本文将深入探讨 JDBC 的各个方面,从基本概念到实际编程示例

    2024年02月07日
    浏览(56)
  • JAVA JDBC数据库开发详解:从入门到精通

    简介: Java是一种面向对象,安全灵活的编程语言,已经成为了世界上最流行的编程语言之一。Java语言的一个重要应用领域就是数据库开发。通过Java JDBC(Java Database Connectivity) API,开发人员可以使用Java语言来访问并操作各种数据库。 本篇资料将会详细介绍Java JDBC数据库

    2024年02月02日
    浏览(42)
  • 【Java 进阶篇】JDBC Connection详解:连接到数据库的关键

    在Java中,要与数据库进行交互,需要使用Java数据库连接(JDBC)。JDBC允许您连接到不同类型的数据库,并执行SQL查询、插入、更新和删除操作。在JDBC中,连接数据库是一个重要的步骤,而 Connection 对象是实现这一目标的关键。本篇博客将详细解释 Connection 对象的作用、创建

    2024年02月05日
    浏览(40)
  • 【Java 进阶篇】JDBC 数据库连接池 C3P0 详解

    数据库连接池是数据库编程中常用的一种技术,它可以有效地管理数据库连接,提高数据库访问的性能和效率。在 Java 编程中,有多种数据库连接池可供选择,其中之一就是 C3P0。本文将详细介绍 C3P0 数据库连接池的使用,包括原理、配置、常见问题和示例代码,旨在帮助基

    2024年02月04日
    浏览(70)
  • 解决 java sdk 链接的 fisco bcos报错的终极指南Caused by: io.netty.channel.ChannelException: init channel network

    有好友询问了一个关于fisco bcos java sdk 链接的问题,记录一下,有遇到的朋友可以参考解决!

    2024年02月11日
    浏览(49)
  • JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

    管他啥是啥,看就完了!如果觉得博主写的不错,可以点赞关注支持一下博主哦!有什么地方存在不足或者错误的,烦请各位大佬在评论区指正。万分感谢!! 本文结合了韩顺平零基础学java,黑马程序员零基础学 JavaWeb,等多个视频的相关知识内容整理而来。花费了很多很多

    2024年02月05日
    浏览(65)
  • Microsoft SQL Server 2019 下载、安装及Java JDBC配置连接数据库(多图详解 超详细)

    一、下载 下载链接Microsoft SQL Server 二、安装 1.找到刚刚下载的文件,双击打开后,选择基本并接受 2.选择接受 3.选择安装位置,并点击安装,然后等待下载安装完成 4.正在安装 -5.遇到了一个问题,重启一下(未遇到该问题的可忽略此步) 6.安装成功,点击安装SSMS 7.点击下载

    2024年02月04日
    浏览(105)
  • 【MySQL数据库】--- 初始数据库以及MySQL数据库在Linux云服务器下载(详细教程)

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 MYSQL数据库 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自

    2023年04月24日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包