常见NIO开源框架(MINA、xSocket)学习 1

【一年前的项目,翻出来总结下】

基于io包的阻塞式socket通信代码简单,在连接数很少的情况下是一个不错的选择。不过实际应用中一个socket服务器采用传统的阻塞式 socket方式通信可能会是一场灾难,一路socket同时进行读写操作可能就需要两条线程,如果需要并发一百路socket(这个量其实很小了),可 能就是两百条线程,大概几分钟后cpu占用率就是高居不下了。

基于原生nio的socket通信时一种很好的解决方案,基于事件的通知模式使得多并发时不用维持高数量的线程,高并发的socket服务器的 java实现成为现实。不过原生nio代码十分复杂,无论编写还是修改都是一件头疼的事。“屏蔽底层的繁琐工作,让程序员将注意力集中于业务逻辑本身”, 有需求就有生产力进步,于是各式各样的nio框架涌现而出,而笔者使用到的是其中最常见的两种:xSocket和MINA。

1 xsocket框架

官网:http://xsocket.sourceforge.net/

xSocket是一套非常简洁的nio框架,利用这套框架,你可以在完全不了解nio的情况下设计出高并发的socket服务器。
server端代码:

Java代码  收藏代码
  1. public class ProjectServer extends Thread {
  2.     private static final int PORT=9099;
  3.     public void run() {
  4.         IServer srv = null;
  5.         try {
  6.             //建立handler
  7.             srv = new Server(PORT, new ProjectHandle());
  8.         } catch (UnknownHostException e) {
  9.             // TODO Auto-generated catch block
  10.             e.printStackTrace();
  11.         } catch (IOException e) {
  12.             // TODO Auto-generated catch block
  13.             e.printStackTrace();
  14.         }
  15.         //服务器运行
  16.         srv.run();
  17.         System.out.println("The ProjectServer start on port: "+PORT);
  18.     }
  19.     public static void main(String[] args) {
  20.         ProjectServer projectServer = new ProjectServer();
  21.         projectServer.start();
  22.     }
  23. }

handler代码

Java代码  收藏代码
  1. public class ProjectHandle implements IDataHandler, IConnectHandler,
  2.         IDisconnectHandler {
  3.     /* 处理连接建立事件 */
  4.     @Override
  5.     public boolean onConnect(INonBlockingConnection nbc) throws IOException,
  6.             BufferUnderflowException, MaxReadSizeExceededException {
  7.         // TODO Auto-generated method stub
  8.         System.out.println(nbc.getId() + "is connect!");
  9.         return true;
  10.     }
  11.     /* 处理连接断开事件 */
  12.     @Override
  13.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
  14.         // TODO Auto-generated method stub
  15.         System.out.println(nbc.getId() + "is disconnect!");
  16.         return true;
  17.     }
  18.     /* 处理接受数据事件 */
  19.     @Override
  20.     public boolean onData(INonBlockingConnection nbc) throws IOException,
  21.             BufferUnderflowException, ClosedChannelException,
  22.             MaxReadSizeExceededException {
  23.         // TODO Auto-generated method stub
  24.         String str = nbc.readStringByDelimiter("\0");
  25.         System.out.println(str);
  26.         return true;
  27.     }
  28. }

这里我们以"\0"为间隔读取数据,xSocket还提供按照长度读取以及全部读取到一个ByteBuffer几种读取数据的方式,如果传递过程 中采取byte数组格式,在接受数据时还可以使用xSocket自带的工具类DataConverter进行转化。譬如接收数据时如此操作:

Java代码  收藏代码
  1. ByteBuffer copyBuffer = ByteBuffer.allocate(20000);
  2. nbc.read(copyBuffer);
  3. copyBuffer.flip();
  4. String str = DataConverter.toString(copyBuffer, "utf-8");

就可以将二进制格式的传输内容还原为原始字符串了。

需要说明的是虽然xSocket代码简单、开发快捷,但是由于太“上层”了,所以很多地方不利于coder自己控制。譬如socket通信中一个 很常见的“半包连包”问题用xsocket处理起来就会很麻烦,而且如果传输协议是经过特殊设计的,xsocket也无法像mina那样自己编写解码器。 当然如果你不是特别计较这些方面,那么非常适于上手的xSocket就是适合你的nio框架。

另,附件中为xsocket所需要的jar包,下载后直接加载项目中即可使用。

【续:http://unbounder.iteye.com/blog/481668

xSocket-2.2.jar

http://unbounder.iteye.com/blog/481396

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓