一、Netty学习资料

书籍《Netty In Action中文版》

对于Netty的十一个疑问
http://news.cnblogs.com/n/205413/

深入浅出Netty
http://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html

Netty了解与小试
http://www.cnblogs.com/xd502djj/archive/2012/06/25/2561318.html

Netty系列之Netty高性能之道【精彩】
http://www.infoq.com/cn/articles/netty-high-performance/

Netty系列之Netty 服务端创建【精彩】
http://www.infoq.com/cn/articles/netty-server-create

Netty 5用户指南
http://ifeve.com/netty5-user-guide/

基于Netty5.0入门案例六之NettyServer群发消息
http://www.bubuko.com/infodetail-575271.html

Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
http://my.oschina.net/imhoodoo/blog/357290

基于Netty与RabbitMQ的消息服务
http://www.cnblogs.com/luxiaoxun/archive/2015/01/28/4257105.html

基于Netty5.0入门案例五之NettyServer字符串编码器
http://www.itstack.org/?post=9

二、代码示例

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

转载于:https://www.cnblogs.com/itfly8/p/5844929.html

JAVA通信系列三:Netty入门总结相关推荐

  1. JAVA通信系列三:Netty入门总结(转)

    一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问 http://news.cnblogs.com/n/205413/ 深入浅出Netty h ...

  2. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  3. Java Servlet系列之Servlet入门

    什么是Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服 ...

  4. java基础系列:集合入门

    集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: Collection是单列集合:Map是双列集合 Collection中只有Set系列要求元素唯一:Map中键需要 ...

  5. java线程同步的实现_【Java多线程系列三】实现线程同步的方法

    packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...

  6. Java基础系列三之继承

    继承 一.什么是继承 继承是一个类继承另一个类,这个类拥有被继承的类中所有的成员方法(除了父类的构造方法)和属性: 继承是面向对象特征之一: 实现继承的类称为子类或者派生类,被继承的类称为父类,或者称 ...

  7. Java自学指南三、入门视频优先

    一门编程语言零基础,想要入门与求职,最快的方式是付钱参加培训班.原因很简单: 讲师都是 IT 企业出来的程序员,知道企业需要掌握什么样编程技能的人才 培训课程教了 n 遍,打磨的很适合不同基础的学员 ...

  8. Java学习系列及数据结构博客全目录

    Java学习系列 Java学习系列(一)Java的运行机制.JDK的安装配置及常用命令详解 Java学习系列(二)Java注释.标识符.基本数据类型及其转换易错点详解 Java学习系列(三)Java运 ...

  9. Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)

    在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...

最新文章

  1. 的正确使用_弹力袜的正确使用
  2. 10.matlab中sort , min/max以及ceil 函数
  3. 设置***遇到一个小问题
  4. Tomcat 7最大并发连接数的正确修改方法(转)
  5. 事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)
  6. SAP ABAP实用技巧介绍系列之如何生成值为NULL的table row
  7. oracle同步恢复目录,Oracle创建恢复目录(catalog)
  8. java引用类型_Java引用类型
  9. gzip算法源代码 - tankzhouqiang - 博客园
  10. JVM GC调优参数说明
  11. 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
  12. 金税开票软件,开票时弹出FRM-000013
  13. 用Python实现双色球随机选号
  14. android wps页面设置背景图片,如何给手机版WPS的文档设置图片背景
  15. MySQL实战演练——如何才能构建逾期用户画像?【数据可视化】
  16. 待办事项-JavaScript实现
  17. 前端学习——HTML(一)
  18. Gate 7.2的学习笔记(一)
  19. 美丽乡村可行性研究报告
  20. 一个自动重连拨号脚本

热门文章

  1. .net网格怎么把值插入指定列表_Python列表有什么内置函数可以使用,怎么使用这些函数...
  2. byfen网java_Java企业级分布式架构师第10期2020年-开课吧全套
  3. 基于Arduino ATmega328人脸识别IOT演示门锁
  4. 关于组织参加2021年全国大学生 智能汽车竞赛东北赛区比赛的报名通知
  5. 第四届全国大学生智能汽车竞赛获奖名单
  6. 深度神经网络控制的巡线智能车
  7. 太难了…期待一切都能赶快好起来吧
  8. Jquery中获取select选中的文本与值
  9. js判断是由含有a节点_如何在 JS 中判断数组是否包含指定的元素(多种方法)
  10. crypto安装_KubeEdge 完整安装 amp; 部署小指南