博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA通信系列三:Netty入门总结
阅读量:5229 次
发布时间:2019-06-14

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

一、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 ChannelHandlerAdapter
2.编写Main方法,启动DiscardServerHandler

Echo

@Override
public 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

转载于:https://www.cnblogs.com/winner-0715/p/7252877.html

你可能感兴趣的文章
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>
疯狂JAVA16课之对象与内存控制
查看>>
[转载]树、森林和二叉树的转换
查看>>
软件测试-----Graph Coverage作业
查看>>
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
Sql常见面试题 受用了
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
CSS背景颜色、背景图片、平铺、定位、固定
查看>>
口胡:[HNOI2011]数学作业
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
中国剩余定理
查看>>
基础笔记一
查看>>
uva 10137 The trip
查看>>
Count Numbers
查看>>