Java码界探秘 Java码界探秘
首页
  • 基础

    • 对象的概念
    • 万物皆对象
    • 控制流
    • 初始化和垃圾回收
    • 封装
    • 复用
    • 多态
    • 接口
    • 内部类
    • 集合
  • 高级

    • 函数式编程
    • 流式编程
    • 异常
    • 代码校验
    • 文件
    • 字符串
    • 类型信息
    • 泛型
    • 数组
    • 枚举
    • 注解
    • 并发编程
    • 设计模式
  • 扩展

    • 编程指南
    • 文档注释
    • 对象传递和返回
    • 流式 IO
    • New IO
    • 理解 equals 和 hashCode 方法
    • 关于集合
    • 并发底层原理
    • 数据压缩
    • 对象序列号
    • C++ 和 Java 的优良传统
  • 基础

    • Netty源码解析
    • Netty概述
    • Netty中的buffer
    • Channel中的Pipeline
    • Netty与Reactor模式
    • Netty中的Handler
    • Netty中的HashedWheelTimer
    • Netty中的Channel(下)
    • Netty中的异步
  • 高级

    • Recycler对象池分析
    • FastThreadLocal源码解析
    • SocketChannel 读取ByteBuf 的过程
    • Netty 内存池分析
    • Netty如何实现高性能内存管理
    • 线程池EventLoopGroup源码分析
    • Netty实例构建一个socks proxy
    • Netty4.x用户指南
    • Netty4和Netty3对比
    • Netty3.2用户指南
    • 3.2 ChannelEvent (opens new window)
    • Netty3.x源码解析
    • 4.x DefaultPromise (opens new window)
  • 基础教程

    • Hello, World!
    • 变量Variables
    • 将参数传递给脚本
    • 数组
    • 数组比较
    • 基础运算符
    • 基础字符串操作
    • 逻辑表达式
    • 循环
    • Shell函数
  • 高级教程

    • 特殊变量
    • 字符串操作
    • 捕捉信号命令
    • 文件测试
    • 管道
    • 输入输出
    • Sed命令介绍
    • Sftp命令介绍
  • 知行:技术人的管理之路(脑图)
  • 软件开发中团队首领的好坏之分
  • 制定规划的策略
  • 打造最佳开发团队的几点建议
  • 给老板汇报技术规划的一些要点
  • 技术的价值怎么在非技术领导心里提现出来?
  • 性格内向,不善言辞的人能做管理吗?
  • 研发管理:与员工一对一交流的执行与反思
首页
  • 基础

    • 对象的概念
    • 万物皆对象
    • 控制流
    • 初始化和垃圾回收
    • 封装
    • 复用
    • 多态
    • 接口
    • 内部类
    • 集合
  • 高级

    • 函数式编程
    • 流式编程
    • 异常
    • 代码校验
    • 文件
    • 字符串
    • 类型信息
    • 泛型
    • 数组
    • 枚举
    • 注解
    • 并发编程
    • 设计模式
  • 扩展

    • 编程指南
    • 文档注释
    • 对象传递和返回
    • 流式 IO
    • New IO
    • 理解 equals 和 hashCode 方法
    • 关于集合
    • 并发底层原理
    • 数据压缩
    • 对象序列号
    • C++ 和 Java 的优良传统
  • 基础

    • Netty源码解析
    • Netty概述
    • Netty中的buffer
    • Channel中的Pipeline
    • Netty与Reactor模式
    • Netty中的Handler
    • Netty中的HashedWheelTimer
    • Netty中的Channel(下)
    • Netty中的异步
  • 高级

    • Recycler对象池分析
    • FastThreadLocal源码解析
    • SocketChannel 读取ByteBuf 的过程
    • Netty 内存池分析
    • Netty如何实现高性能内存管理
    • 线程池EventLoopGroup源码分析
    • Netty实例构建一个socks proxy
    • Netty4.x用户指南
    • Netty4和Netty3对比
    • Netty3.2用户指南
    • 3.2 ChannelEvent (opens new window)
    • Netty3.x源码解析
    • 4.x DefaultPromise (opens new window)
  • 基础教程

    • Hello, World!
    • 变量Variables
    • 将参数传递给脚本
    • 数组
    • 数组比较
    • 基础运算符
    • 基础字符串操作
    • 逻辑表达式
    • 循环
    • Shell函数
  • 高级教程

    • 特殊变量
    • 字符串操作
    • 捕捉信号命令
    • 文件测试
    • 管道
    • 输入输出
    • Sed命令介绍
    • Sftp命令介绍
  • 知行:技术人的管理之路(脑图)
  • 软件开发中团队首领的好坏之分
  • 制定规划的策略
  • 打造最佳开发团队的几点建议
  • 给老板汇报技术规划的一些要点
  • 技术的价值怎么在非技术领导心里提现出来?
  • 性格内向,不善言辞的人能做管理吗?
  • 研发管理:与员工一对一交流的执行与反思
  • 基础

    • Netty源码解析
    • Netty概述
    • Netty中的buffer
    • Channel中的Pipeline
    • Netty与Reactor模式
    • Netty中的Handler
    • Netty中的HashedWheelTimer
    • Netty中的Channel(下)
      • Netty中的Channel(下)
      • 一、Socket的生命周期
      • 二、Netty中Channel的生命周期
      • 三、Netty与NIO
      • 一、连接的创建
        • 上层世界:Netty中Channel的类型及创建
        • 下层世界:NIO中的
      • 二、Interest与Selector
      • 三、服务器端的多线程
      • 回到现实:几种与对应的实现
      • NIO:
    • Netty中的异步
  • 高级

    • Recycler对象池分析
    • FastThreadLocal源码解析
    • SocketChannel 读取ByteBuf 的过程
    • Netty 内存池分析
    • Netty如何实现高性能内存管理
    • 线程池EventLoopGroup源码分析
    • Netty实例构建一个socks proxy
    • Netty4.x用户指南
    • Netty4和Netty3对比
    • Netty3.2用户指南
    • Netty3.x源码解析
  • Netty
  • 基础
daichangya
2024-05-11
目录

Netty中的Channel(下)

# Netty中的Channel(下)

上篇文章讲到了Netty的Channel内部的运作机制和生命周期。这篇文章会走进Netty处理的内部,结合NIO,讲讲Netty中是如何实现Reactor模式的。

上篇文章讲到了Netty的Channel内部的运作机制,这篇文章详细分析Channel的生命周期,以及其与NIO的对应关系。

# 一、Socket的生命周期

在TCP/IP协议中,网络传输层分为TCP和UDP两种。UDP没有连接的概念,双方都是对等的,只存在send&receive,相对简单。对于TCP,乃至于所有有连接的传输层协议,都可以简单的概括为三个步骤:建立连接、传输、关闭连接。

在Java里,无论是OIO还是NIO,都是使用Socket (opens new window)编程方式。在OIO中有ServerSocket、Socket和DatagramSocket,前两个对应TCP,后一个对应UDP。在NIO中,我们改用了ServerSocketChannel、SocketChannel和DatagramChannel,并拥有了基于Selector的通知机制,但是Socket使用的方式可以说没有什么变化。

而对于TCP socket,则需要经过建立连接的过程。

在建立连接之前,存在两个角色:ServerSocketChannel和SocketChannel。

Client端的流程是这样:

open()=>connect()

Server端的流程是这样:

open()=>bind()=>(listen)=>accept()

建立连接之后,C/S双方都会拿到一个对等的SocketChannel,通过它可以进行read()/write()等数据交互,并可以使用close()关闭连接。

而Netty里的Channel,虽然对Java的API做了一层封装,但是仍然沿用了这些状态和概念。下面我们来看看其中具体的实现。

# 二、Netty中Channel的生命周期

我们在使用Netty时,总是需要指定一个ChannelFactory,这个就是Channel的入口。

Open:

Bind:

Accept:

Connect:

Read:

Write:

Netty中一切操作都通过ChannelEvent来体现。关于ChannelEvent的具体类型,官方的Javadoc已经介绍得很详细了:http://netty.io/3.8/api/org/jboss/netty/channel/ChannelEvent.html (opens new window)

parent和child

Boss和Worker

Bind: NioServerBoss

Accept:NioServerBoss.process

Read:NioWorker.read

Write:AbstractNioWorker

# 三、Netty与NIO

NIO Netty
SelectionKey.OP_READ
SelectionKey.OP_WRITE
SelectionKey.OP_CONNECT
SelectionKey.OP_ACCEPT

# 一、连接的创建

# 上层世界:Netty中Channel的类型及创建

我们在使用Netty时,总是需要指定一个ChannelFactory,这个就是

Bind: NioServerSocketChannel

Accept:NioServerBoss

Read:NioWorker.read

Write:AbstractNioWorker

# 下层世界:NIO中的

NIO Netty
SelectionKey.OP_READ
SelectionKey.OP_WRITE
SelectionKey.OP_CONNECT
SelectionKey.OP_ACCEPT

# 二、Interest与Selector

# 三、服务器端的多线程

# 回到现实:几种与对应的实现

# NIO:

Selector	->Boss
		  	->Worker

实际上Channel部分没有太多内容,

TODO

ServerChannel

SocketChannel

DatagramChannel

LocalChannel


ChannelHandler

ChannelUpstreamHandler

ChannelDownstreamHandler

Config Parent & Child

通过handler把底层隔离了

Multiple Reactors

参考资料:

  • Scalable IO in Java http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf (opens new window)
上次更新: 2024/05/11, 17:55:08
Netty中的HashedWheelTimer
Netty中的异步

← Netty中的HashedWheelTimer Netty中的异步→

Theme by Vdoing | Copyright © 2019-2024 daichangya | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式