一、Netty学习资料
书籍《Netty In Action中文版》
对于Netty的十一个疑问
深入浅出Netty
Netty了解与小试
Netty系列之Netty高性能之道【精彩】
Netty系列之Netty 服务端创建【精彩】
Netty 5用户指南
基于Netty5.0入门案例六之NettyServer群发消息
Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
基于Netty与RabbitMQ的消息服务
基于Netty5.0入门案例五之NettyServer字符串编码器
二、代码示例
Hello world
1.编写处理器 DiscardServerHandler extends ChannelHandlerAdapter2.编写Main方法,启动DiscardServerHandlerEcho
@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf in = (ByteBuf) msg; try { while (in.isReadable()) { // (1) System.out.print((char) in.readByte()); System.out.flush(); } } finally { ReferenceCountUtil.release(msg); // (2) }}Time
@Override public void channelActive(final ChannelHandlerContext ctx) { // (1) final ByteBuf time = ctx.alloc().buffer(4); // (2) time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));final ChannelFuture f = ctx.writeAndFlush(time); // (3)
f.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) { assert f == future; ctx.close(); } }); // (4) }流数据的传输处理【分包,黏包】
1.ChannelHandler有2个生命周期的监听方法:handlerAdded()和handlerRemoved()。你可以完成任意初始化任务只要他不会被阻塞很长的时间。public class TimeClientHandler extends ChannelHandlerAdapter { private ByteBuf buf;@Override
public void handlerAdded(ChannelHandlerContext ctx) { buf = ctx.alloc().buffer(4); // (1) }@Override
public void handlerRemoved(ChannelHandlerContext ctx) { buf.release(); // (1) buf = null; }@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf m = (ByteBuf) msg; buf.writeBytes(m); // (2) m.release();if (buf.readableBytes() >= 4) { // (3)
long currentTimeMillis = (buf.readInt() - 2208988800L) * 1000L; System.out.println(new Date(currentTimeMillis)); ctx.close(); } }@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); }}2.TimeClientHandler拆分成2个处理器:TimeDecoder处理数据拆分的问题,TimeClientHandler原始版本的实现public class TimeDecoder extends ByteToMessageDecoder { // (1)
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { // (2) if (in.readableBytes() < 4) { return; // (3) }out.add(in.readBytes(4)); // (4)
}}用POJO代替ByteBuf
参考:
http://www.cnblogs.com/itfly8/p/5844929.html