一、包与类名。

1、所有类和方法严格使用驼峰法命名。例:SSLFilter 更名为 SslFilter。NIO传输类在命名时增加 Nio 前缀。因为NIO 并不是 socket/datagram 传输的实现,NIO 的所有传输类前缀增加 Nio 。之前Java代码:

  1. SocketAcceptor acceptor = new SocketAcceptor();

修改之后的代码:

  1. SocketAcceptor acceptor = new NioSocketAcceptor();

2、Filter 类被重新整理进多重子包内。例如,StreamWriteFilter 被移动到 org.apache.mina.filter.stream ,*.support 的所有包被移动到其父包中。

二、Buffers。

因为MINA ByteBuffer 与JDK中NIO ByteBuffer 同名,ByteBuffer 被重命名为 IoBuffer。不仅使类名简化,也使类名称更加明确。放弃 Buffer 池,默认使用IoBuffer.allocate(int) 来分配 heap buffer。acquire() 与 release() 两个方法将不再容易发生错误,可以调用 free()方法。在大多数JVM中,框架内置的IoBuffer 性能更加强劲稳定。

Direct buffer 池是Mina 早期特性之一,现在主流JVM的 direct buffers 的表现比heap buffers 差,此外 direct buffer memory 的最大值没有正确设定时,不可预期的 outofmemoryError 也经常出现,所以新的版本 buffer类型由 direct 改为 heap 。heap buffers 不需要池化,PooledBufferAllocator 也被除掉了,相应的ByteBuffer.acquire()  release()也被除掉了。 但是如果使用的速度太快,分配 heap buffers也会成为瓶颈,因为分配字节数据要将所有的元素都置为0,这个操作消耗内存带宽。 CachedBufferAllocator 是针对这种情况使用的,但是大多数情况,还是使用默认的 SimpleBufferAllocator 。

三、启动与配置。

1、IoService 配置简化,1.x版本中邮多种方式配置IoService 和它的子接口 IoAcceptor 和 IoConnector 两种方法:在调用bind() 或 connect() 时,具体指定一个 ioServiceConfig

  1. acceptor = new SocketAcceptor();
  2. SocketAcceptorConfig cfg = new SocketAcceptorConfig();
  3. cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter(MinaUAEncoder.class,MinaUADecoder.class));
  4. acceptor.bind( new InetSocketAddress(address, port), new DirectClientSessionHandler(), cfg);

或者 IoService.defaultConfig 属性,此时不需要指定 IoServiceConfig

  1. acceptor = new SocketAcceptor();
  2. acceptor.getDefaultConfig().setReuseAddress(true);
  3. acceptor.bind(new InetSocketAddress("127.0.0.1", 8888), myHandler);

Mina2 简化了网络应用程序的启动,

  1. //Create acceptor
  2. IoAcceptor acceptor = new NioSocketAcceptor();
  3. acceptor.getFilterChain().addLast("logger", new LoggingFilter());
  4. acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
  5. acceptor.setHandler(new HelloWorldServerHandler());
  6. //configurate the buffer size and the iddle time
  7. acceptor.getSessionConfig().setReadBufferSize(2048);
  8. acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
  9. try {
  10. acceptor.bind(new InetSocketAddress(PORT));
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }

四、线程。

ThreadModel 被移除了,最初引入ThreadModel 是为了简化 ioService 预定义的线程模式,配置线程模式却变得非常简单以至于不能引入新的组件,与其易用性相比,线程模式带来了更多的混乱。

ExecutorFilter使用一个特定的Executor实现来维系事件顺序。
在1.x中,可以使用任意的Executor实现来来维系事件顺序,但2.x提供了两个新的
ThreadPoolExecutor实现,OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor,ExecutorFilter维系事件顺序,当以下两种情况:当使用默认构造方法时,ExecutorFilter创建一个OrderedThreadPoolExecutor,或者明确指明使用OrderedThreadPoolExecutor时
OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor内部使用了一些架构来防止发生OutOfMemoryError,所以你应该尽量使用这两个类而不是其他Executor的实现。

五、协议编解码。

DemuxingProtocolCodecFactory被重写了。
新增了DemuxingProtocolEncoder和DemuxingProtocolDecoder两个类,DemuxingProtocolCodecFactory只是这两个类的外壳。register()方法被重命名为addMessageEncoder()和addMessageDecoder(),这个变化使混合使用多个encoders和decoders变得更加自由。
MessageEncoder接口也发生了改变,MessageEncoder.getMessageTypes()被移除了,当你调用addMessageEncoder(),你只需要指明信息的类型,encoder就可以进行正确的编码了。

六、集成。

JMX集成被重新设计。

spring 集成被简化。

七、其他。

TransportType 更名为 TransportMetadata

TransportType 改名是因为它的角色是元数据而不仅仅是一种枚举。

IoSessionLogger 被重新设计。

IoSessionLogger 实现了 SLF4Logger接口,所以可以像声明简单SLF4Logger实例一样声明它,这个变化使你不必向其他不必要的部分暴露 IoSessionLogger 对象。在使用 MDC 时,请考虑使用简单的 MdclnjectionFilter

Mina2 udp--zhengli的更多相关文章

  1. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  2. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  3. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  4. 移动端IM系统的协议选型:UDP还是TCP?

    1.前言 对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码该如何编写. 从PC时代的IM开始,IM开发者就在为数据传输协议的选型争论 ...

  5. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

  6. mina2

      远程通信 Mina2 学习笔记 作者:李少华 邮箱:xiaosanshaoli@126.com QQ:305409913 2010-12-23   初稿 引言... 1 一.       Mina ...

  7. mina2.0 spring

    Apache MINA是一个网络应用程序框架,它可以帮助用户开发的高性能.高扩展性的网络应用程序.它提供了一个抽象的事件驱动的异步API在不同传输如TCP/IP和UDP/IP通过java NIO. A ...

  8. MINA2.0用户手册中文版

    MINA2.0用户手册中文版--第一章 MINA2.0入门 MINA2.0用户手册中文版--第二章 第一节 MINA应用程序架构 MINA2.0用户手册中文版--第二章 第二节 TCP服务端实例 MI ...

  9. [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

    技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解    http://www.52im.net/thread-1309-1-1.html   本文来自腾讯资深研发工程师罗成的技术分享, ...

  10. apache mina2.0源码解析(一)

    apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...

随机推荐

  1. 将button或者input角变为圆弧

    style="border-radius:5px;" input框时,不能用type属性

  2. python str使用笔记(更新)

    判断字符串是否以某个串为结尾: str.endswith(strtmp) 返回True/False >>> strs='aba' >>> strs.endswith ...

  3. LG4238 【【模板】多项式求逆】

    前言 学习了Great_Influence的递推实现,我给大家说一下多项式求逆严格的边界条件,因为我发现改动一些很小的边界条件都会使程序出错.怎么办,背代码吗?背代码是不可能,这辈子都不会背代码的.理 ...

  4. 使用 --image-repository 解决kubeadm 安装k8s 集群 谷歌镜像墙的问题

    从网上我们看到的好多kubeadm 安装k8s 的时候都说需要下拉取镜像,然后修改,实际上 我们可以使用配置参数,快速的跳过墙的问题 说明: 基础镜像,我们仍然存在,拉取的问题,但是dockerhub ...

  5. 2D Platformer 学习

    using UnityEngine; using System.Collections; /// <summary> /// 玩家控制 /// </summary> publi ...

  6. 设置 sideload Outlook Add-ins

    上期,我们讲到了用前端技术去建立一个outlook add-ins 我们今天来讲解一下怎样测试一个sideload outlook add-ins. 1. 我们需要登录Outlook在Office 3 ...

  7. 如何利用 Chrome 来模拟移动网络来调试 FastAdmin 网站

    如何利用 Chrome 来模拟移动网络来高度 FastAdmin 网站 因为目前大多数都在开发移动类的网页,所以客户端的速度下载速度要也考虑. 虽然都已经 4G 了,但还是要看看在网络质量很差的情况 ...

  8. 用actor model实现intel tbb这样的用法

    关于什么事actor model,什么事intel tbb这样的用法我就不详细说了,具体请上网查文档 class MyActor { F f; MyActor inputs[]; MyActor ou ...

  9. spring中ApplicationContextAware接口描述

    项目中使用了大量的工厂类,采用了简单工厂模式: 通过该工厂类可以获取指定的处理器bean,这些处理器bean我们是从spring容器中获取的,如何获取,是通过实现ApplicationContextA ...

  10. 利用JSON将Map转换为类对象

    Map类型做为一种常见的Java类型,经常在开发过程中使用,笔者最近遇到要将Map对象做为一种通用的参数变量,下传到多个业务类方法中,然后在各个业务类方法中将Map转换为指定类对象的情况.如何将Map ...