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=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。
@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=new byte[result.readableBytes()]; String res=new String(data); System.out.println("Client said: "+res); result.release(); ctx.write(msg); }
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一致。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。