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一致。


你可能感兴趣的:(socket,netty,nio)