文档章节

Netty学习笔记(10)——Netty中的Channel组件

江左煤郎
 江左煤郎
发布于 11/18 16:08
字数 1064
阅读 7
收藏 0

1. Channel的功能

    1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操作封装到一个接口中,统一对外提供。相比于NIO中的Channel,Netty提供的Channel相关组件使用起来更加灵活方便。

    2. API功能介绍:

(1)Channel read():从当前的Channel中读取数据到第一个inbound缓冲区,如果数据被成功读取,那么就会触发Channel读取事件,并且回调ChannelHandler.channelRead(ChannelHandlerContext, Object)方法;读取完成后,就会触发读取完成事件,并且调用ChannelHandler.channelReadComplete(ChannelHandlerContext)方法。

(2)ChannelFuture write(Object msg):将msg通过ChannelPipeline写入到当前Channel中,但是该方法并没有真正的将数据写入到Channel中,而是将数据暂时保存再一个数组中,直到调用Channel的flush方法才会进行发送。

(3)ChannelFuture write(Object msg, ChannelPromise promise):功能与ChannelFuture write(Object msg)相同,但是携带了ChannelPromise参数设置写入操作的结果,是ChannelFuture的子接口,其实作用差不多和ChannelFuture 一样的,就是用来获取write操作的结果,依据对应的结果进行对应的操作。

(4)ChannelFuture writeAndFlush(Object msg)和ChannelFuture writeAndFlush(Object msg, ChannelPromise promise):写操作,但是会自动将写入的数据自动发送,也就是相当于调用了write方法和flush两个方法。

(5)Channel flush():发送写入的数据。

(6)ChannelFuture close(ChannelPromise promise):主动关闭当前连接,通过设置的ChannelPromise来进行事件完成的回调方法,无论操作是否成功,都可以通过ChannelPromise来获取close操作的执行结果,并且该操作会ChannelPipeline中所有的ChannelHandler的close(ChannelHandlerContext, ChannelPromise)事件。

(7)ChannelFuture disconnect()/ChannelFuture disconnect(ChannelPromise promise):请求断开远程连接,可以选择通过ChannelPromise来接收处理结果的通知,该方法会触发ChannelHandler的disconnect(ChannelHandlerContext, ChannelPromise)事件。

(8)ChannelFuture connect(SocketAddress remoteAddress):该方法主要用于建立连接,remoteAddress为指定的目标IP地址,ChannelFuture 中会保存着连接操作的处理结果,如果连接超时,操作结果为ConnectTimeoutException,如果目标ip拒绝建立连接,操作结果为ConnectException。该方法还会级联触发ChannelHandler#connect(ChannelHandlerContext, SocketAddress, SocketAddress, ChannelPromise)事件。

  • ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress):重载方法,该方法localAddress是表示首先绑定本地的ip地址,然后再发起连接请求。
  • ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise):重载方法,该方法中的ChannelPromise 表示将连接操作结果保存到该对象中,当然,返回的ChannelFuture 对象中同样也有处理结果。
  • ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise):重载方法

(9)ChannelFuture bind(SocketAddress localAddress)/ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise):绑定本地IP地址,该方法会触发ChannelHandler的bind(ChannelHandlerContext, SocketAddress, ChannelPromise)事件。

(10)ChannelConfig config():获取当前Channel的配置信息,比如连接超时时间等。

(11)boolean isOpen():判断当前Channel是否开启

(12)boolean isRegistered():判断当前Channel是否注册到EventLoop中。

(13)boolean isActive():判断当前Channel是否为激活状态并且处于已连接状态。

(14)ChannelMetadata metadata():返回当前Channel的元数据,包括TCP参数配置等

(15)SocketAddress localAddress():返回当前Channel绑定的本地IP地址和端口

(16)SocketAddress remoteAddress():返回连接的远程IP地址和端口

(17)EventLoop eventLoop():该方法是Channel中非常常用的一个方法,在使用Channel是会将Channel注册到EventLoop 的多路复用器中,然后我们需要通过该方法来获取当前Channel注册的EventLoop EventLoop 就相当于NIO中的Selector。

目前仅以各个组件的功能应用为主进行学习,后期完整了解各个组件之间的运用后,在详细学习底层原理。

 

© 著作权归作者所有

江左煤郎

江左煤郎

粉丝 26
博文 129
码字总数 305609
作品 0
西安
后端工程师
私信 提问
Qzone 微信 Java高级——dubbo源码分析之远程通信 netty

Java高级——dubbo源码分析之远程通信 netty dubbo 底层通信选择了 netty 这个 nio 框架做为默认的网络通信框架并且通过自定义协议进行通信。dubbo 支持以下网络通信框架: Netty(默认) Min...

Java架构师那些事
2018/08/29
0
0
《深入探索Netty原理及源码分析》文集小结

写在2017年末尾,翻看文集的第一篇文章已经是三个月前的事了,也没想过这文集会写那么久,这么慢。。。 Netty文集中的文章主要都是我学习过程的笔记,写博客的主要目的是为了通过输出来倒逼输...

tomas家的小拨浪鼓
2017/12/30
0
0
Netty in Action ——— Netty的组件和设计

本文是Netty文集中“Netty in action”系列的文章。主要是对Norman Maurer and Marvin Allen Wolfthal 的 《Netty in action》一书简要翻译,同时对重要点加上一些自己补充和扩展。 本章涵盖...

tomas家的小拨浪鼓
2017/11/06
0
0
【死磕Netty】—–Netty的核心组件

原文出处http://cmsblogs.com/ 『chenssy』 转载请注明原创出处,谢谢! 在第一篇博客中(【死磕Netty】-----NIO基础详解),那一大坨的服务端、客户端代码各位应该看着都会害怕。博主在 15 年...

chenssy
2017/12/03
0
0
5. 彤哥说netty系列之Java NIO核心组件之Channel

你好,我是彤哥,本篇是netty系列的第五篇。 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一——Channel。 思维转变 首先,我想说的...

彤哥读源码
12/01
52
0

没有更多内容

加载失败,请刷新页面

加载更多

vue.js-详解三大流行框架VUE_快速进阶前端大咖-Vue基础

作者 | Jeskson 来源 | 达达前端小酒馆 Vue概述: MVX模式简介,Vue框架简介,Vue.js的安装与使用。 Vue基础语法: 实例对象,生命周期,模板语法,计算属性,methods方法 Vue渲染: 列表渲染...

达达前端小酒馆
今天
4
0
OSChina 周五乱弹 —— 匹诺曹也是韩国人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @watergood :分享海先生的单曲《烟花巷》 《烟花巷》- 海先生 手机党少年们想听歌,请使劲儿戳(这里) @Cyber-Pan :已经很久没有十点前下过...

小小编辑
今天
8
1
Snack3 之 Jsonpath使用

Snack3 之 Jsonpath使用 一、 Snack3 和 JSONPath 介绍 Snack3 是一个支持JSONPath的JSON框架。JSONPath是一个很强大的功能,也可以在Java框架中当作对象查询语言(OQL)来使用。 <dependenc...

刘之西东
今天
5
0
7. 彤哥说netty系列之Java NIO核心组件之Selector

<p align="right">——日拱一卒,不期而至!</p> 你好,我是彤哥,本篇是netty系列的第七篇。 简介 上一章我们一起学习了Java NIO的核心组件Buffer,它通常跟Channel一起使用,但是它们在网络...

彤哥读源码
昨天
21
0
在Jupyter notebooks 中运行GRASS GIS

在Ubuntu16.04中,首先安装jupyter: python3 -m pip install --upgrade pippython3 -m pip install jupyter 然后创建一个sh脚本: # directory where GRASS GIS lives# GRASS GIS 的安装......

ddd口木呆
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部