Netty介绍(二)

举报
黄生 发表于 2022/10/24 23:47:48 2022/10/24
【摘要】 netty-all是集合了Netty所有模块的全集。也可以按需引入,比如只想使用netty-codec-redis比如一个Handler,EchoServerHandler继承自ChannelInboundHandlerAdapter,它又实现了ChannelInboundHandler接口。Inbound或Outbound表示方向,所以实质处理是ChannelHandler只覆盖chann...

netty-all是集合了Netty所有模块的全集。
也可以按需引入,比如只想使用netty-codec-redis
比如一个Handler,EchoServerHandler
继承自ChannelInboundHandlerAdapter,它又实现了ChannelInboundHandler接口。
Inbound或Outbound表示方向,所以实质处理是ChannelHandler
只覆盖channelRead()方法,它在收到消息时被调用。

public class EchoServerHandler extends ChannelInboundHandlerAdapter {

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) {
		System.out.println(ctx.channel().remoteAddress() + " -> Server :" + msg);
		
		// 写消息到管道
		ctx.write(msg);// 写消息
		ctx.flush(); // 冲刷消息
		
		// 上面两个方法等同于 ctx.writeAndFlush(msg);
	}
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

		// 当出现异常就关闭连接
		cause.printStackTrace();
		ctx.close();
	}
}

NioEventLoopGroup用来处理IO操作的多线程事件循环器。
多少个线程,在哪里看呢?

Netty底层是基于Java NIO实现,因此也使用了Selector模型
Selector模型解决了阻塞IO中,一个客户端一个线程的问题。
可以监视一个或多个NIO通道,识别何时可以使用一个或多个NIO通道进行数据传输,
这样,一个线程可以管理多个通道,从而管理多个网络连接。

Node.js也用到了类似的机制。

Channel和Selector的关系确定后,一旦Channel处于某种就绪的状态,就可以被Selector查询到。
通过调用Selector的select方法完成。

Channel是java NIO的一个抽象,代表一个连接到如设备、文件、网络socket等的连接;或是一个可以完成IO操作的程序。
回调Callback是通知相关方某个操作已经完成最常用的方法之一
Netty的使用,当一个回调发生,事件可以被ChannelHandler的接口处理,
如Channel有可读消息时,EchoServerHandler的回调方法channelRead()会被调用

Future提供了另一个当操作完成时如何通知应用的方法。

责任链模式的优点:请求和处理分开
请求者不知道谁处理;处理者不知道请求的全貌
有点像流水线的工位
ChannelPipeline接口设计,就采用责任链模式,底层采用双向链表,
将链上的各个处理器串联起来。每个请求到来,ChannelPipeline中所有的处理器都有机会处理它。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。