NIO 将最耗时的 IO操作(填充和提取缓冲区)转移回os ,提高速度

原有I/O 以流方式,NIO以块方式处理数据

流(In/Out putStream)是单向的,通道是双向的

通道是对原 I/O 包中流的模拟

阻塞

  • Thread.sleep 放弃cpu
  • 同步代码/方法 无法取得锁,进入等候队列
  • 进入了同步代码/方法后,遇到Object.wait ,进入等候队列,等 nofity(all) 才再次进步就绪队列
  • 线程 join
  • io/远程(如socket)等待资源

jdk 6 nio基于Linux nio,用reactor(类似observer)和多线程实现异步非阻塞

jdk 7 加入aio基于linux aio

mina vs xsocket

相同

  • 都对nio进行有效屏蔽, 简化开发, 文本流模式应用,两者都非常简单,实现一个基本的handle就可以
  • 提供了常见的辅助功能,比如日志等, mina支持更全面一些
  • 可以通过绑定各种附加属性实现基于会话的工作方式,会话控制都提供了完整的支持
  • 理论上都可以提供lowerlevel数据的处理支持, 不过实际操作, mina比较复杂,文档也缺失

差异

设计出发点

  • xsocket

轻量级解决方案,核心思想是屏蔽,简化nio方式的的开发,并不需要过多的学习

  • Mina

服务端开发的基础平台,提供的支持相对更全面,复杂

缺少对java nio的深入理解, 对mina一些特性就难以利用

数据处理

  • xsocket

通过提供对基本类型的支持来做到简单灵活的操作

  • mina

希望在更高的层面上即通过自定义的协议扩展来屏蔽掉应用对数据的处理操作,把核心放置到业务处理逻辑上

自定义协议

  • mina

通过 encoder/decoder模式支持自定义协议,屏蔽底层数据操作,对于客户端和服务器都是java的应用,处理比较简单

缺省提供了对文本, java对象的处理。协议以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网络的特性,即一次数据可能分为多个包发送)

  • mina

分包会直接报错, 需要使用会话控制的方式来对包进行组装处理,比较复杂

从服务器向客户端写大包的时候, 1.1和2.0处理不同,2.0不做控制会直接报一个bytebuffer溢出的错误

  • xscoket

缺省会吞掉这个错误,自动采用重试的方式尝试读取数据,对开发来说比较简单

也可以提供类似mina那样的安全处理模式,代码比mina要简单

文档支持

  • mina

比较多,但是语焉不详,问题要靠自己啃代码和上论坛

  • xsocket

只有一篇文档, 但是比较详尽的介绍了所有需要的知识

学习曲线

  • mina

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

  • xsocket

基本不用学习工作