首页 > 代码库 > netty学习笔记
netty学习笔记
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端的消息,并打印出来 @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("client channelRead"); ByteBuf result = (ByteBuf) msg; byte[] data=http://www.mamicode.com/new byte[result.readableBytes()];>4、ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用ctx.write(msg) 将传递到ChannelOutboundHandler。
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.debug("InboundHandler1 channelRead "+ctx); ctx.fireChannelRead(msg); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.debug("InboundHandler2 channelRead "+ctx); ByteBuf result=(ByteBuf)msg; byte[] data=http://www.mamicode.com/new byte[result.readableBytes()];>5、ctx.write()方法执行后,需要调用flush()方法才能令它立即执行。
@Override public 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一致。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。