1、不选择java原生nio的原因
   (1)nio的类库和api繁杂
   (2)需要具备其他的额外的技能做铺垫,例如熟悉java多线程编程。
   (3)可靠性能力补齐的工作量和难度都非常大,例如客户面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。
   (4)jdk nio的bug,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致cpu100%,虽然官方声称修复了该问题,但是直到jdk1.7版本,该问题还存在,只是bug几率降低了而已、
2、为什么选择netty
   (1)api使用简单,开发门槛低;
   (2)功能强大,预置了多种编解码功能,支持多种主流协议;
   (3)定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展;
   (4)性能高,通过与其他业界主流的nio框架对比,netty的综合性能最优;
   (5)成熟,稳定,netty修复了已经发现的所有jdk nio bug
   (6)社区活跃,版本迭代周期短,经历大规模商业应用的考验等;

netty的简单示例,maven项目:http://yunpan.cn/cwGN7HydZ6tRs  访问密码 0624
3、TCP粘包和拆包问题
   (1)TCP是个“流”协议,所谓流,就是没有界限的一串数据,大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
   (2)粘包和拆包问题产生原因主要有以下原因:
          应用程序write写入的字节大小大于套接口发送缓冲区大小;
          进行MSS大小的TCP分段;
          以太网帧的payload大于MTU进行IP分片
   (3)问题解决主要有如下几种策略:
         消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
         在包尾增加回车换行符进行分割,例如FTP协议
         将消息分为消息头和消息体,消息头中包含表示消息总长度(或消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;
         更复杂的应用层协议

出现粘包/分包问题的示例,maven项目:http://yunpan.cn/cwGTLsjvYHsj8  访问密码 687b

netty提供的三种解决粘包/分包问题的方法的maven项目:http://yunpan.cn/cwGiwLHgu3NLI  访问密码 bd18
4、java序列化问题
    (1)序列化的性能
    (2)序列化后的码流大小
    (3)无法跨语言
     正因为jdk自带的序列化和反序列化存在上面的问题,所以一般我们都不使用jdk自带的序列化
5、protobuf框架
     protobuf全称为Google Protocol Buffers,它将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。
     它的特点如下:
        (1)结构化数据存储格式(xml,json等)
        (2)高效的编解码性能;
        (3)语言无关、平台无关、扩展性好;
        (4)官方支持JAVA、C++和Python三种语言
     首先我们来看下为什么不使用XML,尽管XML的可读性和可扩展性非常好,也非常适合描述数据结构,但是XML解析的时间开销和XML为了可读性而牺牲的空间开销都非常大,因此不适合做高性能的通信协议。        Protobuf使用二进制编码,在空间和性能上其有更大的优势。
     Protobuf另外一个比较吸引人的地方就是它的数据描述文件和代码生成几只,利用数据描述文件对数据结构进行说明的优点如下:
       (1)文本化的数据结构描述语言,可以实现语言和平台无关。特别使用异构系统间集成;
       (2)通过标识字段的顺序,可以实现协议的前向兼容
       (3)自动代码生成,不需要手工编写同样数据结构的C++和JAVA版本;
       (4)方便后续的管理和维护。相比于代码,结构化的文档更容易管理和维护。
6、JBoss Marshalling介绍
    JBoss Marshalling是一个java对象的序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容:同时增加了一些可调的参数和附加的特性,并且这些参数和特性可通过工厂类进行配置。
    相比于传统的java序列化几只,它的优点如下:
       (1)可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制;
       (2)可插拔的对象替换技术,不需要通过继承的方式;
       (3)可插拔的预定义类缓存表,可以减小序列化的字节数组长度,提供常用类型的对象序列化性能;
       (4)无须实现java.io.Serializable接口,即可实现java序列化;
       (5)通过缓存技术提升对象的序列化性能。
7、WebSocket介绍
     HTTP协议的主要弊端总结如下:
         HTTP协议为半双工协议。半双工协议指数据可以在客户端和服务端两个方向上传输,但是不能同时传输。它以为着在同一时刻,只有一个方向上的数据传送
         HTTP消息冗长而繁琐。HTTP消息包含消息头、消息体、换行符等。 通常情况下采用文本方式传输,相比于其他的二进制通信协议,冗长而繁琐。
         针对服务器推送的黑客攻击,比如长时间轮询。
     在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者就可以直接互相传送数据了。WebSocket基于TCP双向全双工进行消息传递,在同一时刻,既可以发送消息,也可以接受消息,相比于HTTP的半双工协议,性能得到很大提升。
     WebSocket的特点主要有以下几点:
         单一的TCP连接,采用全双工模式通信;
         对代理、防火墙和路由器透明
         无头部信息、Cookie和身份验证
         无安全开销
         通过“ping/pong”帧保持链路激活
         服务器可以主动传递消息给客户端,不再需要客户端轮询

netty学习的更多相关文章

  1. netty学习资料

    netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...

  2. Netty学习之客户端创建

    一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...

  3. netty学习资源收集

    Netty学习笔记 Netty In Actions CSDN专栏 一起学Netty-CSDN专栏 Netty In Action中文版

  4. Netty 学习 一、初识Netty【原创】

    在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...

  5. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  6. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  7. Netty 学习资料

    Netty 学习资料 Netty 学习资料 链接网址 说明 Netty 4.x 用户指南 http://wiki.jikexueyuan.com/project/netty-4-user-guide/ ...

  8. Netty学习第一节Netty的总体概况

    一.Netty简介 什么是Netty? 1.高性能事件驱动,异步非阻塞的IO加载开源框架. 它是由JBoss提供,用于建立TCP等底层链接.基于Netty可以建立高性能的HTTP服务器,快速开发高性能 ...

  9. Netty学习——Thrift的入门使用

    Netty学习——Thrift的入门使用 希望你能够,了解并使用它.因为它是一个效率很高的框架 官网地址:http://thrift.apache.org/ 1.Thrift数据类型 一门技术如果需要 ...

  10. Netty学习——Apache Thrift 简介和下载安装

    Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...

随机推荐

  1. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  2. uml的四种关系

    UML的四种常用关系: 泛化关系.关联关系.实现关系.依赖关系 其中泛化关系是指父类与子类之间的继承关系: 实现关系是指接口与实现类之间的关系: 依赖关系和关联关系的区别如下: 只要存在对象间的交互, ...

  3. [转]在WPF中区别TextBlock和Label

    TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速 ...

  4. jquery ajax get /post

    $.get(URL,callback); $("button").click(function(){ $.get("demo_test.asp",functio ...

  5. offer

    八月份仿真实验室国赛以后,我并没有开始做一些关于找工作的准备,而是在做自己感兴趣的cocos2d-x,大概花了一个星期的时间从安装平台到查资料写了一个flappybird小游戏,将近开学了才把找工作的 ...

  6. js原生方法传参的细节(面试必问)

    废话不说,直接上题. slice(),接收两个参数,第一个为开始index(从0开始),第二个为结束的index(也是从0开始,但是不包括index本身,只到index-1).返回值是截取的数组,原数 ...

  7. 查看表的datapages

    select object_name(i.object_id) as tableName,data_pages as dataPagesfrom sys.indexes as ijoin sys.pa ...

  8. 永久解决火狐浏览器出现的flash版本更新问题

    最近使用的火狐浏览器又出问题了,老是出现flash版本太旧,以至于在火狐的版本出现“该版本存在安全隐患,应当更新”的字样.对于火狐浏览器,我很早就开始使用了,flash版本更新的问题,我也有我的一些小 ...

  9. 今天研究一下SVN的分支和合并

    关键字: trunk, branch, tag, merge 以前一直以为很难,没敢接触.今天晚上看了一下,也不过如此 用起来还是很简单的

  10. 通过pinyin4j.jar将(汉字拼音混合字符串)转化成字母首字母

    通过pinyin4j.jar将(汉字拼音混合字符串)转化成字母首字母 例如 我的中国心    ==> wdzgx 我的中国心ya ==> wdzgxya woai我的中国 ==> w ...