http://www.blogjava.net/ghostdog/archive/2008/06/10/MinaVsXsocket.html实在无聊,考虑把当前应用的通讯模式由http移植为socket, 服务器这块因为对NIO并不熟悉,所以考虑使用现成的网络通讯框架进行移植,花了点时间测试比较流行的mina和xsocket。
== 相同点 ==
  1. 都对nio进行了有效屏蔽, 可以简化开发过程, 对于文本流模式的应用,两者都非常简单,实现一个基本的handle就可以
  2. 提供了一些常见的辅助功能,比如日志等, mina支持更全面一些
  3. 可以通过绑定各种附加属性实现基于会话的工作方式,会话控制都提供了完整的支持
  4. 理论上都可以提供lowerlevel数据的处理支持, 不过实际操作, mina比较复杂,文档也缺失。
  5. 都提供了客户端使用包,简化客户端开发
  6. 都提供了jmx的集成支持,可以通过第三方工具来监控使用状况
== 差异 ==
  两者设计的出发点不同, xsocket是一个轻量级的解决方案,核心思想是屏蔽,简化nio方式的的开发,并不需要过多的学习。 Mina的目的在我看来更多的是提供一个服务器开发的基础平台,相对来说提供的支持要全面,也复杂的多, 如果缺少对java nio框架的深入理解, 对mina的一些特性就难以利用。 对数据的处理,xsocket的出发点是通过提供对基本类型的支持来做到简单灵活的操作, 而mina则希望在更高的层面上即通过自定义的协议扩展来屏蔽掉应用对数据的处理操作,把核心放置到业务处理逻辑上。

做一个简单比较如下

  • 自定义协议
            * mina通过 encoder 和decoder模式来支持自定义的协议,目的是屏蔽底层数据的操作,对于客户端和服务器都是java的应用,处理比较简单。缺省提供了对文本, java对象的处理。但是对于客户端是j2me或者其他语言的,这种模式就比较难以使用了。比如我当前的协议是以byte[]为基础的,mina就不能很好的处理。
            * xsocket并不关注这点, 关注的是对nio的屏蔽。
  • 对filter模式的支持
            * mina利用filter模式提供对数据流操作的封装和扩展,是核心模式。 另外也提供了一些缺省的有用filter,比如compress等
            * xsocket不关注这个问题, 所以说mina更象应用服务器平台, xscoket是一个通讯模块
  • 缺省对文本操作的支持
            文本流模式是比较常见的网络应用模式,比如http , smtp服务,聊天应用等
            * mina 通过增加一个!TextLineCodecFactory filter来提供对文本操作的支持, 传入的数据会被自动整理成文本信息。 但是并未提供额外的处理支持
  chain.addLast("codec", new ProtocolCodecFilter(
                new TextLineCodecFactory()));


   public void messageReceived(IoSession session, Object message) {
        Logger log = LoggerFactory.getLogger(ChatProtocolHandler.class);
        log.info("received: " + message);
        String theMessage = (String) message;
        String[] result = theMessage.split(" ", 2);  //自己分析文本段落
    

* xscoket把对文本的支持做为基本属性,并且提供了Delimiter这样的支持,相比mina要好用一些。而对于解析http中mulitpart这样的文本二进制混合的结构,显然要比mina 好使。

 String data = nbc.readStringByDelimiter("\r\n", "gbk"); //缺省提供delimiter的操作,
      System.out.println(data);  //中文读取正常
       nbc.write(data + "\r\n");  //回写是乱码
       nbc.write(data + "\r\n", “gbk”);  //正常
  • 对流的操作
            * mina提供一个streamiohandler的类, 可以使用基于流的方式进行处理操作,实际使用有点复杂,需要在一个独立的线程中工作,会增加服务器负担。
            * xsocket 没仔细研究, 但是因为提供了对基本类型操作的支持,所以可以自行包装流来解决,比较简单。
  • 对lowerlevel方式数据的处理
            * mina需要熟悉nio框架部分的bytebuffer的操作
            * xsocket可以直接支持以基本类型的模式进行操作, 也支持使用bytebuffer的方式,更加简单灵活
  • 对fragment的处理 tcp网络的特性,即一次数据可能分为多个包发送, 也就是fragment
            * mina对分包会直接报错, 需要使用会话控制的方式来对包进行组装处理,比较复杂。 另外从服务器向客户端写大包的时候, 1.1和2.0处理不同,2.0不做控制会直接报一个bytebuffer溢出的错误。
            * xscoket缺省会吞掉这个错误,自动采用重试的方式尝试读取数据,对开发来说比较简单,另外也可以提供类似mina那样的安全处理模式,代码比mina要简单。
  • 文档支持
           * mina 比较多,但是语焉不详,问题要靠自己啃代码和上论坛
           * xsocket 只有一篇文档, 但是比较详尽的介绍了所有需要的知识。另外,视乎, xsocket的代码质量要更好一些, mina更向是不断学习过程中不断完善改进的作品。
  • 学习曲线

*mina 要较好的使用需要对nio有深入的了解, 一般使用学习难度不大
                * xsocket 基本不用学习

== 结论 ==

我的应用是手机和服务器端通过自定义的二进制协议进行通讯,我需要的是一个轻量级的解决方案。 
   使用mina的自定义协议方式处理需要额外的工作量, 而mina对直接操作基本数据类型的支持并不好,或者说需要我深入的学习nio部分内容。  最终因为fragment和对lowerlevel数据的更简单的支持让我选择了xsocket,很轻松的完成了移植工作。
   如果一开始设计通讯部分就接触mina的话,我可能会坚持使用mina的自定义协议方式来处理,但是就目前来说,他太复杂了,将来有时间,可以做为应用模式的学习对mina进行深入解剖。

== 其他 ==
   其他常见的java的通讯协议框架
   qickeserver : 以文本流为模式的通讯框架
   netty: mina的前身
   cindy: 国人在接触netty之后开发的, 我接触时已经停止开发一年了,所以基本不予考虑。

== 补充 ==

下午无聊又玩了一下quick server。
   1. quickserver 1.4.7 现在有提供对binary模式的支持,可以使用一个ClientBinaryHandle处理二进制流,不过处理稍显复杂,还要多开一个线程。对当前的应用来说xsocket已经足够了。
   2. quickserver 在易用性和复杂程度方面在xsocket和mina之间, 架构上更倾向于解决较复杂的问题,和mina有很多相似处。
较复杂的数据处理也需要引入流和bytebuffer的概念。
   3. quick的文档和例子都不错, 要明显比mina好, 有点不爽的是配置文件有点婆妈,考虑到我的一般应用都是要集成到服务器中使用的,觉得有点烦,不过基本可以放弃研究mina了。
   4. quick 架构上handle的使用可以配置,产生类似mina那种filter的效果,还是蛮有意思的。
   5. 另外还自己实现了一些婆婆妈妈的管理界面,有空看看完。
最后许可证协议只要使用binary的包,商用就没问题。

其实这3个框架都是以回调和组装为中心的设计,关注点有所不同而已。自己比较懒还是喜欢那种越简单越好的,看mina有点头疼。

网络通讯框架MINA和XSCOCKET的简单比较的更多相关文章

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 0.前言

                                  目       录 前言 前言 刚参加工作,使用过VB.VC开发软件,随着C#的崛起,听说是C++++,公司决定以后开发软件使用C#,凭借在 ...

  2. 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  4. [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

    目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           ...

  5. [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计

    目       录 第五章           串口和网络统一IO设计... 2 5.1           统一IO接口... 2 5.1.1    串口IO.. 4 5.1.2    网络IO.. ...

  6. [连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计

    目       录 第三章           设备驱动的设计... 2 3.1           初始化设备... 4 3.2           运行设备接口设计... 4 3.3        ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  8. [连载]《C#通讯(串口和网络)框架的设计与实现》- 6.通讯控制器的设计

    目       录 第六章           通讯控制器的设计... 2 6.1           控制器接口... 2 6.2           串口控制器... 3 6.3          ...

  9. Flutter学习(7)——网络请求框架Dio简单使用

    原文地址: Flutter学习(7)--网络请求框架Dio简单使用 | Stars-One的杂货小窝 Flutter系列学习之前都是在个人博客发布,感兴趣可以过去看看 网络请求一般APP都是需要的,在 ...

随机推荐

  1. netcore命令行部署|跨域问题

    1.在hosting中修改发布端口号,如遇见不识别IP则改成*再用命令行运行 { "server.url": "http://*:8089"} 3.给接口开外网 ...

  2. 【转】C#中的implicit 和 explicit

    The implicit and explicit keywords in C# are used when declaring conversion operators. Let's say tha ...

  3. Z-Score数据标准化处理(python代码)

    #/usr/bin/python def Z_Score(data): lenth = len(data) total = sum(data) ave = float(total)/lenth tem ...

  4. HDU——4291A Short problem(矩阵快速幂+循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. BZOJ3555 [Ctsc2014]企鹅QQ 【hash】

    题目 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验, ...

  6. 微信小程序中 input组件影响页面样式的问题

    input组件有个默认的宽高,好像是不能清除的,在使用flex布局的时候,发现会影响到页面的布局,以为是flex布局的问题,改为float布局试了下也是同样的问题,试着把input标签换成别的标签,问 ...

  7. 高阶函数之函数柯里化function currying

    var cost = (function(){    var args = [];    return function(){        if(arguments.length === 0){   ...

  8. 关于 ajax 动态返回数据 css 以及 js 失效问题(动态引入JS)

    ajax 毕竟是异步的 所以动态加载出来的数据 难免遇到 css 或者 js 失效的问题,所以要动态加载 css ji等文件了 1.公共方法 load //动态加载 js /css function ...

  9. Opus 和 AAC 声音编码格式

    Opus编码器 是一个有损声音编码的格式,由互联网工程任务组(IETF)近来开发,适用于网络上的实时声音传输,标准格式为RFC 6716.Opus 格式是一个开放格式,使用上没有任何专利或限制. Op ...

  10. 标准C程序设计七---41

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...