Netty源码分析---Connect与Bind对比总结

Netty架构篇 - Bootstrap、ServerBootstrap 本文主要分析Bootstrap、ServerBootstrap的相关方法的底层源码。 阅读详情

[connect和bind过程详解(一)-优快云博客](connect和bind过程详解(一))

[connect和bind过程详解(二)-优快云博客](connect和bind过程详解(二))

Netty Connect 与 Bind 对比总结

一、快速对比表

对比项Connect(客户端)Bind(服务端)
使用场景客户端连接服务端服务端绑定端口
Channel 类型NioSocketChannelNioServerSocketChannel
JDK 底层操作SocketChannel.connect()ServerSocketChannel.bind()
是否异步是(可能异步)否(同步完成)
返回值含义true=立即成功, false=正在进行无返回值(同步)
监听的事件OP_CONNECT → OP_READOP_ACCEPT
完成后的操作finishConnect() → 读写数据接受新连接
EventLoopGroup单个 workerGroupbossGroup + workerGroup
Pipeline 传播tail → head(Outbound)tail → head(Outbound)
超时处理有(可配置连接超时)无(立即完成)

二、调用链路对比

2.1 Connect 调用链路

Bootstrap.connect(host, port)
  ↓
doResolveAndConnect()
  ├─→ initAndRegister() [创建 NioSocketChannel]
  └─→ doResolveAndConnect0() [DNS 解析]
       ↓
  doConnect() [提交任务]
       ↓
  pipeline.connect() [tail → head]
       ↓
  unsafe.connect()
       ↓
  NioSocketChannel.doConnect()
       ↓
  SocketChannel.connect() [JDK]
       ↓
  ┌────────┴────────┐
  ↓                 ↓
立即成功      正在进行中
  ↓                 ↓
完成Promise    注册 OP_CONNECT
  ↓                 ↓
channelActive   等待事件就绪
  ↓                 ↓
注册 OP_READ    finishConnect()
                    ↓
               完成Promise
                    ↓
               channelActive
                    ↓
               注册 OP_READ

2.2 Bind 调用链路

ServerBootstrap.bind(port)
  ↓
doBind()
  ├─→ initAndRegister() [创建 NioServerSocketChannel]
  └─→ doBind0() [提交任务]
       ↓
  pipeline.bind() [tail → head]
       ↓
  unsafe.bind()
       ↓
  NioServerSocketChannel.doBind()
       ↓
  ServerSocketChannel.bind() [JDK]
       ↓
  绑定成功(同步)
       ↓
  完成Promise
       ↓
  channelActive
       ↓
  注册 OP_ACCEPT
       ↓
  等待客户端连接
       ↓
  OP_ACCEPT 就绪
       ↓
  doReadMessages() [接受连接]
       ↓
  创建 NioSocketChannel
       ↓
  channelRead 事件
       ↓
  ServerBootstrapAcceptor
       ↓
  注册到 workerGroup

三、相同点

3.1 都必须先 Register

无论是 connect 还是 bind,都必须先完成 register 操作:

// 都会先调用 initAndRegister()
final ChannelFuture regFuture = initAndRegister();
final Channel channel = regFuture.channel();

// 等待 register 完成后,再执行 connect 或 bind
if (regFuture.isDone()) {
    // register 已完成
    doXxx(channel, ...);
} else {
    // register 还未完成,添加监听器
    regFuture.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) {
            doXxx(channel, ...);
        }
    });
}

3.2 都在 EventLoop 线程中执行

// Connect
channel.eventLoop().execute(new Runnable() {
    @Override
    public void run() {
        channel.connect(remoteAddress, connectPromise);
    }
});

// Bind
channel.eventLoop().execute(new Runnable() {
    @Override
    public void run() {
        channel.bind(localAddress, promise);
    }
});

3.3 都通过 Pipeline 传播(Outbound 事件)

// 都是从 tail 开始,向 head 传播
pipeline.connect(remoteAddress, promise);  // Connect
pipeline.bind(localAddress, promise);      // Bind

// 传播路径:tail → 自定义 OutboundHandler → head

3.4 都由 Head 调用 Unsafe

// HeadContext
@Override
public void connect(...) {
    unsafe.connect(remoteAddress, localAddress, promise);
}

@Override
public void bind(...) {
    unsafe.bind(localAddress, promise);
}

3.5 都会触发 channelActive 事件

// 完成后都会触发 channelActive
if (!wasActive && isActive()) {
    pipeline.fireChannelActive();
}

四、不同点详解

4.1 同步 vs 异步

Connect(异步):

// 调用 JDK 的 connect,可能返回 false
boolean connected = SocketUtils.connect(javaChannel(), remoteAddress);

if (!connected) {
    // 连接正在进行中,注册 OP_CONNECT 事件
    selectionKey().interestOps(SelectionKey.OP_CONNECT);
    // 等待 NioEventLoop 监听到 OP_CONNECT 事件
    // 然后调用 finishConnect() 完成连接
}

Bind(同步):

// 调用 JDK 的 bind,立即完成
javaChannel().bind(localAddress, config.getBacklog());
// 没有返回值,绑定立即完成

4.2 监听的事件不同

Connect 后监听 OP_READ:

// 连接完成后,开始监听 OP_READ,准备读取数据
selectionKey().interestOps(SelectionKey.OP_READ);

Bind 后监听 OP_ACCEPT:

// 绑定完成后,开始监听 OP_ACCEPT,准备接受新连接
selectionKey().interestOps(SelectionKey.OP_ACCEPT);

4.3 后续处理不同

Connect 后的处理:

// 1. 连接完成
finishConnect();

// 2. 触发 channelActive
pipeline.fireChannelActive();

// 3. 开始读写数据
// 用户的 handler 可以开始发送和接收数据

Bind 后的处理:

// 1. 绑定完成
doBind(localAddress);

// 2. 触发 channelActive
pipeline.fireChannelActive();

// 3. 开始接受新连接
// 当有客户端连接时:
doReadMessages(readBuf);  // 接受连接,创建 NioSocketChannel
pipeline.fireChannelRead(child);  // 传递给 ServerBootstrapAcceptor
childGroup.register(child);  // 注册到 workerGroup

4.4 EventLoopGroup 的使用

Connect(客户端):

// 只需要一个 EventLoopGroup
EventLoopGroup workerGroup = new NioEventLoopGroup();

Bootstrap b = new Bootstrap();
b.group(workerGroup)  // 只设置一个 group
 .channel(NioSocketChannel.class);

Bind(服务端):

// 需要两个 EventLoopGroup
EventLoopGroup bossGroup = new NioEventLoopGroup(1);      // 接受连接
EventLoopGroup workerGroup = new NioEventLoopGroup();     // 处理 IO

ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)  // 设置两个 group
 .channel(NioServerSocketChannel.class);

五、代码示例对比

5.1 客户端 Connect 示例

public class NettyClient {
    public static void main(String[] args) throws Exception {
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            Bootstrap b = new Bootstrap();
            b.group(workerGroup)
             .channel(NioSocketChannel.class)
             .option(ChannelOption.AUTO_READ, true)
             .handler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 protected void initChannel(SocketChannel ch) {
                     ch.pipeline().addLast(new MyClientHandler());
                 }
             });
            
            // 【Connect】连接服务端
            ChannelFuture f = b.connect("localhost", 8080).sync();
            System.out.println("客户端连接成功");
            
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
        }
    }
}

5.2 服务端 Bind 示例

public class NettyServer {
    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 128)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 protected void initChannel(SocketChannel ch) {
                     ch.pipeline().addLast(new MyServerHandler());
                 }
             });
            
            // 【Bind】绑定端口
            ChannelFuture f = b.bind(8080).sync();
            System.out.println("服务端启动成功,监听端口:8080");
            
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
}

六、常见问题对比

Q1:为什么 Connect 可能是异步的,而 Bind 是同步的?

A:

  • Connect:需要进行 TCP 三次握手,涉及网络传输,需要时间
    客户端 ---SYN---> 服务端
    客户端 <--SYN+ACK--- 服务端
    客户端 ---ACK---> 服务端
    
  • Bind:只是在本地绑定端口,不涉及网络通信,操作系统可以立即完成

Q2:为什么服务端需要两个 EventLoopGroup?

A:

  • bossGroup:专门负责接受新连接(处理 OP_ACCEPT)

    • 通常只需要 1 个线程
    • 接受连接的操作很快
  • workerGroup:负责处理已建立连接的 IO 操作

    • 需要多个线程(根据 CPU 核心数)
    • IO 操作比较耗时

类比:

  • bossGroup = 餐厅的迎宾员(迎接客人)
  • workerGroup = 餐厅的服务员(为客人服务)

Q3:Connect 超时了怎么办?

A:

Bootstrap b = new Bootstrap();
b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);  // 设置连接超时 5 秒

ChannelFuture future = b.connect("localhost", 8080);
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture f) {
        if (!f.isSuccess()) {
            System.out.println("连接失败:" + f.cause());
            // 可以实现重试逻辑
        }
    }
});

Q4:Bind 失败了怎么办?

A:

try {
    ChannelFuture f = serverBootstrap.bind(8080).sync();
} catch (Exception e) {
    // 可能的原因:
    // 1. 端口已被占用
    // 2. 没有权限绑定该端口(如 80 端口需要 root 权限)
    // 3. 地址不可用
    
    System.out.println("绑定失败:" + e.getMessage());
    
    // 可以尝试绑定其他端口
    serverBootstrap.bind(8081).sync();
}

七、性能优化建议

7.1 客户端优化

Bootstrap b = new Bootstrap();
b.group(workerGroup)
 .channel(NioSocketChannel.class)
 // 1. 启用 TCP_NODELAY,禁用 Nagle 算法,减少延迟
 .option(ChannelOption.TCP_NODELAY, true)
 // 2. 启用 SO_KEEPALIVE,保持长连接
 .option(ChannelOption.SO_KEEPALIVE, true)
 // 3. 设置连接超时
 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
 // 4. 设置发送缓冲区大小
 .option(ChannelOption.SO_SNDBUF, 1024 * 64)
 // 5. 设置接收缓冲区大小
 .option(ChannelOption.SO_RCVBUF, 1024 * 64);

7.2 服务端优化

ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
 .channel(NioServerSocketChannel.class)
 // 1. 设置 TCP 连接队列大小
 .option(ChannelOption.SO_BACKLOG, 1024)
 // 2. 启用地址重用(服务重启时快速绑定端口)
 .option(ChannelOption.SO_REUSEADDR, true)
 // 3. 为子 Channel 启用 TCP_NODELAY
 .childOption(ChannelOption.TCP_NODELAY, true)
 // 4. 为子 Channel 启用 SO_KEEPALIVE
 .childOption(ChannelOption.SO_KEEPALIVE, true)
 // 5. 设置子 Channel 的缓冲区大小
 .childOption(ChannelOption.SO_SNDBUF, 1024 * 64)
 .childOption(ChannelOption.SO_RCVBUF, 1024 * 64);

八、总结

8.1 Connect 的核心要点

  1. 异步操作:可能需要等待 OP_CONNECT 事件
  2. 单 EventLoopGroup:只需要 workerGroup
  3. 连接完成后:开始读写数据
  4. 超时处理:可配置连接超时时间
  5. 重试机制:需要用户自己实现

8.2 Bind 的核心要点

  1. 同步操作:立即完成,无需等待
  2. 双 EventLoopGroup:bossGroup + workerGroup
  3. 绑定完成后:开始接受新连接
  4. 主从 Reactor:bossGroup 接受连接,workerGroup 处理 IO
  5. ServerBootstrapAcceptor:负责将新连接注册到 workerGroup

8.3 共同点

  1. 都必须先 register
  2. 都在 EventLoop 线程中执行
  3. 都通过 Pipeline 传播(Outbound 事件)
  4. 都由 Head 调用 Unsafe
  5. 都会触发 channelActive 事件
Netty源码分析(一) --- Server/Client启动流程,建立连接和Read剖析 一、Netty源码分析 https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/echo 上找到echo这个example 1.1 服务端启动流程 1.1.1 两个NioEventLoopGroup 服务端代码首先要定义两个NioEventLoopGroup,打个断点进去 NioEventLoopGroup继承MultithreadEventLoopGroup,加载的时候执行父类静态方法,初始化DEFA 阅读详情

相关推荐

BLE天线设计避坑:NRF52832官方50欧姆阻抗匹配的3个常见误区

本文深入解析NRF52832蓝牙SoC天线设计中的常见误区,重点探讨50欧姆阻抗匹配的3个关键问题:PCB板材介电常数差异、匹配元件寄生参数及VSWR测试。通过实测数据和优化方案,帮助工程师规避设计陷阱,提升BLE通信性能。

beer8的博客 216

Netty源码分析:connect与bind两条启动链路的本质区别与实战排查

在Java网络编程中,Netty作为高性能异步通信框架,其客户端与服务端的启动机制常让开发者困惑:为何客户端用connect而服务端用bind?这背后涉及NIO的SocketChannel与ServerSocketChannel底层差异,以及ChannelFuture异步结果的处理逻辑。理解从Bootstrap到JDK底层Channel的完整调用链,有助于掌握TCP连接建立、端口绑定、事件循环等核心原理。实践中,连接超时、端口占用、回调不触发等问题,往往源于对这两条链路失败模型和Promise完成时机的误解

weixin_32715349的博客 288

S32DS3.5图形化配置实战:从零构建S32K144通信接口工程

本文详细介绍了如何使用S32DS3.5图形化配置工具从零构建S32K144通信接口工程。通过实战演示引脚配置、时钟树设置、SPI接口搭建等关键步骤,帮助开发者快速掌握NXP S32K系列开发技巧,提升嵌入式开发效率。特别针对S32DS3.5版本的新特性进行了深度解析,包括智能代码生成和调试优化方法。

weixin_26834815的博客 200

Netty+源码解析(九)_+connect+过程和+bind+过程分析

Netty 源码分析系列: Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty 源码解析(三): Netty 的 Future 和 Promise Netty 源码解析(四): Netty 的 ChannelPipeline Netty 源码解析(五): Netty 的线程池分析 Netty 源码解析(六): Channel 的 register 操作 Netty 源码解析(七): NioEventLoop 工作流程 Netty 源码解析(八): 回

不朽丶 296

Pcileech(DMA)开源项目简述

希望大DMA家能正确认识FPGA,正确使用DMA技术,对于市场上各类伪装成花里胡哨设备的FPGA板卡它的本质是不会变的,不要上当受骗。

2301_79773847的博客 5966

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 294

Netty中Connect与Bind操作原理及性能优化

在网络编程中,Socket的Connect和Bind操作是构建网络通信的基础。Connect操作实现客户端主动连接服务器,涉及DNS解析、TCP握手等关键步骤;Bind操作则是服务端绑定端口的核心机制,需要处理端口复用、多网卡等复杂场景。作为高性能网络框架,Netty对这两个操作进行了深度优化,包括连接池化、批量DNS解析、SO_REUSEADDR端口重用等关键技术。理解这些底层原理对于开发高并发网络应用至关重要,特别是在微服务架构和分布式系统中,合理的Connect/Bind配置能显著提升系统吞吐量和稳定

weixin_33387339的博客 115

LTspice基础教程-028.Timestep too small

Q: “Timestep too small” error message A: If the LTspice program can’t find a solution for the guessed time step, then the program decreases the time step and tries again. This can’t work forever. If...

gaoyong_wang的博客 2万+

Netty源码解析:Connect与Bind两大操作的核心差异与NIO事件链路

在Java网络编程中,连接(Connect)与绑定(Bind)是服务端和客户端启动时最基础的操作,但底层实现却遵循着完全不同的逻辑。理解二者的差异,需要从NIO事件模型入手:Bind负责监听端口并注册OP_ACCEPT等待新连接,而Connect则需经历DNS解析、发起连接、注册OP_CONNECT直至连接完成。二者虽共用部分注册代码,却在NioEventLoop的事件分发中走向不同分支。掌握backlog、connectTimeoutMillis等参数的实际作用,不仅有助于Netty源码分析,更能快速定位

weixin_29256771的博客 318

Java代码变更影响分析:从静态解析到动态调用图的实战全链路

本文介绍了Java代码提交影响分析的核心原理与实现方法。主要内容包括:1)静态分析技术,通过JavaParser解析AST构建调用图,记录类与方法间的调用关系;2)动态分析技术,使用ByteBuddy进行字节码增强,捕获运行时调用路径;3)JCCI工具实现,结合javalang、unidiff等技术分析代码改动影响,并将结果存储到SQLite数据库。文章提供了完整的代码示例,展示了从AST解析、动态调用跟踪到实际工具应用的完整技术栈,为代码变更影响分析提供了实用解决方案。

墨夶的博客 1253

YOLO11涨点优化:损失函数优化 | 引入MPDIoU,利用边界框左上角和右下角距离,彻底解决重叠框匹配失效问题

【摘要】针对目标检测中重叠框匹配失效问题,本文提出基于MPDIoU损失函数的解决方案。MPDIoU通过同时约束边界框的左上角和右下角两点距离,有效解决了传统IoU损失在重叠场景下的优化歧义问题。文章首先分析YOLO系列在密集目标检测中的性能瓶颈,指出GIoU/CIoU等现有方法无法区分相同IoU值但偏移方向不同的预测框。随后详细解析MPDIoU的数学原理及其相对于主流损失函数的优势,证明两点距离约束能提供唯一优化方向。最后给出在YOLO11中实现MPDIoU的具体方案,包括核心代码修改点和架构适配建议。实验

2601_95807009的博客 173

netty源码分析一

前段时间比较忙,没有时间去学习啦,现在稍微好一点啦,看着自己年初定下的目标,还有很多没有完成的呀。从下阶段起学习netty框架啦,之前也了解netty框架,但是没有深入理解,现在好好学习一下。 学习netty框架之前,要了解java nio基本知识java nio常见的API有 channel  channel可以理解为通道,其中包括TCP/UDP还有文件 FileChannelDat

hy614的专栏 558

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4007

第3章 --- netty的源码分析 Channel创建过程

目录 1.调用链过程 2.初始化入口:bind()/connect()方法 3.实例化Channel 1.查看AbstractBootstrap.initAndRegister()以下代码 2.channel是由AbstarctBootstrap的成员变量channelFactory进行实例化的。 3.进入channelFactory()方法,发现改方法仅仅将参数传递进入并并初...

小蜜蜂 411

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Netty源码分析】客户端connect服务端过程

上一篇博客【Netty源码分析】Netty服务端bind端口过程 我们介绍了服务端绑定端口的过程,这一篇博客我们介绍一下客户端连接服务端的过程。ChannelFuture future = boostrap.connect("127.0.0.1", 8080).sync(); 调用BootStrap的connect函数public ChannelFuture connect(String ine

井底之蛙 3591

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Netty源码分析-服务启动

启动基类:AbstractBootStrap: 1. 该类主要定义了客户端和服务端启动netty均需要的字段和方法,核心字段包括: EventLoopGroup:线程池,如果是服务端则在拓展类ServerBootstrap中可以选择再定义一个chilEventLoopGroup,用于处理已...

chuntuotuo1753的博客 201

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

netty的LocalChannel源码分析

LocalChannel介绍 LcoalChannel是Netty提供的用来在同一个JVM内部实现client和server之间通信的transport。它的实现主要是通过内存里的对象作为通信介质,不会像NIO下的channel,会占用一个文件描述符;因此使用它不会影响到你系统上的打开文件数,也就不会影响到你系统所能管理的连接数了。对于在同一个JVM内部使用netty的机制进行通信的话,相对来说...

robin的专栏 1380

netty4源码分析-bind

本文为原创,转载请注明出处 netty4源码分析-bind  在前一篇文章中分析了监听套接字ServerSocketChannel的创建过程,本文接着分析绑定IP和端口的过程。  回到之前未分析完的doBind逻辑,前一篇文章已分析到dobind方法中initAndRegister方法,该方法最终触发了对regPromise 的listener的回调,Listener将bind任务加到b...

海浪儿 261

认真的 Netty 源码解析(二)

Channel 的 register 操作经过前面的铺垫,我们已经具备一定的基础了,我们开始来把前面学到的内容揉在一起。这节,我们会介绍 register 操作,这一步其...

JAVA高级架构 619

netty源码分析系列——Channel

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34399060的博客 409

Netty学习之旅------源码分析ChannelPipeline实现原理

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来目录:部分内容截图:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-BsdcrZcN-1712656409200)]

2301_82242670的博客 1085

netty源码分析 之二 transport(bootstrap)

transport 分为两部分  bootstrap channel  由于channel东西比较多,所以分开两篇来写 AbstractBootstrap 顾名思义,引导累   抽象父类, 定义模板方法 成员变量 private volatile EventLoopGroup group; @SuppressWarnings("deprecation")

akfly的专栏 708

Netty源码分析之NioEventLoop

本文分析Netty的NioEventLoop是如工作的。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENfGVW05-1644982158935)(//upload-images.jianshu.io/upload_images/2184951-2e248d85df2a1a86.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/490/format/webp)] NioEventLoop中维护了一个线程,线程启动时会调用

huapro.vip的程序人生 189

【Netty】Netty 程序引导类(九)

Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHandler(四)ChannelPipeline源码分析(五)字节缓冲区 ByteBuf (六)(上)字节缓冲区 ByteBuf(七)(下)Netty 如何实现零拷贝(八)程序引导类(Bootstrap)可以理解为是一个程序的入口程序,在 Java 程序中,就是一个包含 main 方法的程序类。在 Netty 中,引导程序还包含一系列的配置项。本篇文章我们就来介绍 Netty 的引导程序。

DreamSun的博客 3563

自顶向下深入分析Netty(三)--Bootstrap源码分析

长文预警,本文为源码分析部分,夹杂大量源码可能会引起不适,请选择性阅读。如果你只想知道Bootstrap的使用,可以阅读前一篇文章:自顶向下深入分析Netty(三)--Bootstrap 2.源码分析 Bootstrap类图 首先看Bootstrap类图,可见类图比较简单。在分析时也使用自顶向下的方法,首先分析顶层的AbstractBootstrap,然后分析其子类B

Fashion-liu的博客 775
上一篇: connect和bind过程详解(二)
下一篇: Netty源码分析---doRegister方法详解
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值