博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
netty学习笔记
阅读量:6825 次
发布时间:2019-06-26

本文共 2463 字,大约阅读时间需要 8 分钟。

hot3.png

1、在没有任何encoder、decoder的情况下,Netty发送接收数据都是按照ByteBuf的形式,其它形式都是不合法的。

ByteBuf result = (ByteBuf) msg;byte[] data = new byte[result.readableBytes()];result.readBytes(data);String resultStr = new String(data);// 接收并打印客户端的信息System.out.println("Client said:" + resultStr);// 释放资源,这行很关键result.release();		// 向客户端发送消息String response = "I am ok!";// 在当前场景下,发送的数据必须转换成ByteBuf数组ByteBuf encoded = ctx.alloc().buffer(4 * response.length());encoded.writeBytes(response.getBytes());ctx.write(encoded);ctx.flush();

2、接收发送数据操作都是通过handler实现的,handler在netty中占据了非常重要的位置。

class HelloServerInHandler extends ChannelInboundHandlerAdapter

3、netty的handler是基于事件触发的,例如当client连接server成功后,client中的HelloClientIntHandler的channelActive方法会自动调用。

// 接收server端的消息,并打印出来  @Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)			throws Exception {	System.out.println("client channelRead");	ByteBuf result = (ByteBuf) msg;  	byte[] data=new byte[result.readableBytes()];	result.readBytes(data);	System.out.println("Server said:" + new String(data));	result.release();}

4、ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用ctx.write(msg) 将传递到ChannelOutboundHandler。

@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)			throws Exception {	log.debug("InboundHandler1 channelRead "+ctx);	ctx.fireChannelRead(msg);}		@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)			throws Exception {	log.debug("InboundHandler2 channelRead "+ctx);	ByteBuf result=(ByteBuf)msg;	byte[] data=new byte[result.readableBytes()];	String res=new String(data);	System.out.println("Client said: "+res);	result.release();			ctx.write(msg);}

5、ctx.write()方法执行后,需要调用flush()方法才能令它立即执行。

@Overridepublic void write(ChannelHandlerContext ctx, Object msg,			ChannelPromise promise) throws Exception {	log.debug("OutboundHandler1 write");	String str="i am ok";	ByteBuf encoded=ctx.alloc().buffer(str.length()*4);	encoded.writeBytes(str.getBytes());			ctx.write(encoded);	ctx.flush();}

6、ChannelOutboundHandler 在注册的时候需要放在最后一个ChannelInboundHandler之前,否则将无法传递到ChannelOutboundHandler。

ChannelPipeline pipeline=ch.pipeline();    pipeline.addLast(new OutboundHandler1());pipeline.addLast(new OutboundHandler2());    pipeline.addLast(new InboundHandler1());pipeline.addLast(new InboundHandler2());

7、Encoder、Decoder的本质也是Handler,它们的执行顺序、使用方法与Handler保持一致。

   执行顺序是:Encoder 先注册的后执行,与OutboundHandler一致;Decoder是先注册的先执行,与InboundHandler一致。

转载于:https://my.oschina.net/freegarden/blog/300348

你可能感兴趣的文章
Java 复用类
查看>>
[CS] 来电处理流程
查看>>
我的友情链接
查看>>
cin.ignore与cin.getline的体验
查看>>
powershell常用命令
查看>>
我的友情链接
查看>>
linux 查看编码格式、用户及组状态
查看>>
squid FATAL: Received Segment Violation...dying.
查看>>
mem调优
查看>>
内核编译安装学习笔记
查看>>
做好数据备份 对你多重要
查看>>
Maven项目导出工程依赖JAR包
查看>>
tomcat修改时区
查看>>
dojo.declare,dojo.define,dojo.require解释
查看>>
浏览器的重绘与重排
查看>>
Web开发必知的八种隔离级别
查看>>
酷炫的显示主页面
查看>>
org.apache.catalina.startup.Catalina start之过程分析
查看>>
CAA如何进行干涉检查?
查看>>
silverlight vs flash
查看>>