Netty中Channel的学习

原创 2018年04月17日 16:53:04

1. Channel

Channel是Netty的核心概念之一,它是Netty网络通信的主体,由它负责同对端进行网络通信、注册和数据操作等功能。

1.1 工作原理

如上图所示:

  • 一旦用户端连接成功,将新建一个channel同该用户端进行绑定
  • channel从EventLoopGroup获得一个EventLoop,并注册到该EventLoop,channel生命周期内都和该EventLoop在一起(注册时获得selectionKey)
  • channel同用户端进行网络连接、关闭和读写,生成相对应的event(改变selectinKey信息),触发eventloop调度线程进行执行
  • 如果是读事件,执行线程调度pipeline来处理用户业务逻辑

1.2 状态转换

如上图所示,Channel包含注册、活跃、非活跃和非注册状态,在一般情况下是从注册->活跃->非活跃->非注册,但用户可以从eventloop取消和重注册channel,因此在此情况下活跃->非注册->注册

1.3 线程

多个channel可以注册到一个eventloop上,所有的操作都是顺序执行的,eventloop会依据channel的事件调用channel的方法进行相关操作,每个channel的操作和处理在eventloop中都是顺序的,如下图:

2. ChannelPipeline和ChannelHandler

ChannelPipeline和ChannelHandler用于channel事件的拦截和处理,Netty使用类似责任链的模式来设计ChannelPipeline和ChannelHandler

ChannelPipeline相当于ChannelHandler的容器,channel事件消息在ChannelPipeline中流动和传播,相应的事件能够被ChannelHandler拦截处理、传递、忽略或者终止,如下图所示:

2.1 INBOUD和OUTBOUND事件

inbound:当发生某个I/O操作时由IO线程流向用户业务处理线程的事件,如链路建立、链路关闭或者读完成等
outbound:由用户线程或者代码发起的IO操作事件

2.2 ChannelHandlerContext

每个ChannelHandler 被添加到ChannelPipeline 后,都会创建一个ChannelHandlerContext 并与之创建的ChannelHandler 关联绑定。如下图:

ChannelHandler通过ChannelHandlerContext来操作channel和channelpipeline

2.3 ChannelHandler

ChannelHandler负责I/O事件或者I/O操作进行拦截和处理,用户可以通过ChannelHandlerAdapter来选择性的实现自己感兴趣的事件拦截和处理。

由于Channel只负责实际的I/O操作,因此数据的编解码和实际处理都需要通过ChannelHandler进行处理。

2.4 注意

ChannelPipeline是线程安全的,多个业务线程可以并发的操作ChannelPipeline;ChannelHandler不是线程安全的,用户需要自己保重ChannelHandler的线程安全

3. ChannelFuture与ChannelPromise

在Netty中,所有的I/O操作都是异步的,因此调用一个I/O操作后,将继续当前线程的执行,但I/O操作的结果怎么获得?——ChannelFuture。

如上图,当前线程A异步发起I/O操作后,不阻塞继续执行相关操作,当IO线程B完成后,通过回调执行A设置的回调方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZuoAnYinXiang/article/details/79977271

VC++游戏开发中学习数据结构

数据结构比较枯燥,结合游戏(例如植物大战僵尸等)开发,了解数据结构(链表、二叉树、HASH表的)的使用,知其然知其所以然。
  • 2017年07月18日 14:56

Netty学习之旅------Netty Channel 概述

本文主要从Channel概述、Channel接口API,Channel类图三个方面简单介绍一下Channel及其提现,为进一步解剖Netty Channel,ChanelPiple,ChannelHa...
  • prestigeding
  • prestigeding
  • 2017-02-09 15:45:05
  • 2172

netty学习的一些总结

最近因为工作关系要完成tcp的长链接推送,公司原来选择的是netty框架,就学习一下,怕忘了就做些笔记,实用的是netty5的handleradapter,是对netty4的in和out的handle...
  • yoyohunter
  • yoyohunter
  • 2016-11-16 10:32:13
  • 729

Netty 3 Bootstrap和Channel的生命周期

Netty 3 Bootstrap和Channel的生命周期 Bootstrap简介 Bootstrap :引导程序,将ChannelPipeline、Channe...
  • mdq11111
  • mdq11111
  • 2018-01-01 19:09:53
  • 128

Netty学习笔记(二) Channel和ChannelFuture

Channel接口 Channel介绍 Channel的基本方法 关于Channel的释放 ChannelFuture接口 ChannelFuture介绍 ChannelFuture的状态 Gener...
  • lgj123xj
  • lgj123xj
  • 2017-11-21 23:02:44
  • 1021

Netty中的Channel机制(上)

Channel是理解和使用Netty的核心。之前在概述中粗略讲到了事件驱动机制,在这篇文章中,我们将详细分析Channel及其的实现。ChannelPipeline的涉及内容较多,这里我使用由浅入深的...
  • DENGZHUYU
  • DENGZHUYU
  • 2014-10-22 16:58:05
  • 878

Netty游戏服务器开发——利用Channel绑定机制 共享聊天服务器与逻辑服务器信息

Netty游戏服务器开发——利用Channel绑定机制 共享聊天服务器与逻辑服务器信息 因为工作原因,之前做的网游项目一直没有时间对其技术点做一个统一的整理,今天正好朋友问到了这个问题,所以顺便...
  • esoft_lsj
  • esoft_lsj
  • 2015-07-16 16:55:48
  • 2527

学习 java netty (三) -- Channel

学习 java netty (三) – Channel 前言:netty封装的channel,看一下官网的定义 A nexus to a network socket or a compon...
  • wwh578867817
  • wwh578867817
  • 2015-07-30 00:04:33
  • 4495

netty4.0.x源码分析—channel

备注:本文的分析基于netty 4.0.9final版本,仅对Nio进行分析,因为本人对Socket编程比较感兴趣。 1、channel总体机构图 nio channel的总体结构图如下: 2、关键...
  • pingnanlee
  • pingnanlee
  • 2013-09-23 15:33:27
  • 12924

netty基础入门(channel理解)

备注:本文的分析基于netty 4.0.9final版本,仅对Nio进行分析,因为本人对Socket编程比较感兴趣。 1、channel总体机构图 nio channel的总体结构图如下:...
  • yuanyuan214365
  • yuanyuan214365
  • 2017-05-21 11:21:47
  • 335
收藏助手
不良信息举报
您举报文章:Netty中Channel的学习
举报原因:
原因补充:

(最多只允许输入30个字)