MINA框架源码分析(一)

作为一个比较优秀的网络通信框架,MINA框架大大的方便了我们开发高性能、高扩展性应用程序的效率,他的底层实现是java NIO,众所周知NIO是同步非阻塞式IO,使用它我们可以开发高并发的java程序,但是使用起来过于复杂也让人望而却步,MINA对NIO进行了二次封装,使用起来还是比较简单的,因为项目中用到了他来实现长连接心跳检测,所以决定研究下他的源码,更关键的是他优秀的线程模型和责任链机制,好了,我们先从一个实例开始说起;

        首先先看服务端:

        使用MINA步骤:

        (1):创建一个NioSocketAcceptor对象;

        (2):为NioSocketAcceptor对象添加Filter对象,这个Filter可以认为是二进制数据与对象之间的转换器,可以设置多个,可以使用框架自带的,我们也可以自己写,在这里我们使用框架自带的;

        (3):创建一个继承自IoHandlerAdapter的业务逻辑处理类MinaServerHandler,并且重写IoHandlerAdapter里面的方法,我们这个示例中将仅仅是打印一些输出信息;

        (4):将MinaServerHandler对象设置到NioSocketAcceptor对象上面;

        (5):为当前NioSocketAcceptor绑定IP以及端口号;

        MinaServer.java

[java]  view plain  copy
  1. public class MinaServer {  
  2.       
  3.     public static void main(String[] args) {  
  4.         MinaServer server = new MinaServer();  
  5.         server.initServer(9898);  
  6.     }  
  7.       
  8.     public void initServer(int port)  
  9.     {  
  10.         NioSocketAcceptor acceptor = new NioSocketAcceptor();  
  11.         MinaServerHandler handler = new MinaServerHandler();  
  12.         try {  
  13.             acceptor.getFilterChain().addLast("codec"new ProtocolCodecFilter(new TextLineCodecFactory()));  
  14.             acceptor.setHandler(handler);  
  15.             acceptor.bind(new InetSocketAddress(port));  
  16.         } catch (IOException e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
  20. }  

        MinaServerHandler.java

[java]  view plain  copy
  1. public class MinaServerHandler extends IoHandlerAdapter{  
  2.   
  3.     @Override  
  4.     public void exceptionCaught(IoSession session, Throwable cause)  
  5.             throws Exception {  
  6.         System.out.println("exceptionCaught");  
  7.     }  
  8.   
  9.     @Override  
  10.     public void messageReceived(IoSession session, Object message)  
  11.             throws Exception {  
  12.         String receiverContent = (String)message;  
  13.         System.out.println("server messageReceived: "+receiverContent);  
  14.         session.write("Server has received message");  
  15.     }  
  16.   
  17.     @Override  
  18.     public void messageSent(IoSession session, Object message) throws Exception {  
  19.         System.out.println("messageSent");  
  20.     }  
  21.   
  22.     @Override  
  23.     public void sessionClosed(IoSession session) throws Exception {  
  24.         System.out.println("sessionClosed");  
  25.     }  
  26.   
  27.     @Override  
  28.     public void sessionCreated(IoSession session) throws Exception {  
  29.         System.out.println("sessionCreated");  
  30.     }  
  31.   
  32.     @Override  
  33.     public void sessionIdle(IoSession session, IdleStatus status)  
  34.             throws Exception {  
  35.         System.out.println("sessionIdle");  
  36.     }  
  37.   
  38.     @Override  
  39.     public void sessionOpened(IoSession session) throws Exception {  
  40.         System.out.println("sessionOpened");  
  41.     }  
  42. }  
        接着查看客户端      

        使用MINA步骤:

        (1):创建一个NioSocketConnector对象;

          (2):为NioSocketConnector对象添加Filter对象,这个Filter可以认为是二进制数据与对象之间的转换器,可以设置多个,可以使用框架自带的,我们也可以自己写,在这里我们使用框架自带的;

        (3):创建一个继承自IoHandlerAdapter的业务逻辑处理类MinaClientHandler,并且重写IoHandlerAdapter里面的方法,我们这个示例中将仅仅是打印一些输出信息;

        (4):创建连接,为NioSocketConnector绑定IP和端口号,同时我们要获得connect的返回值,并且调用返回值的awaitUninterruptibly方法,因为我们后面需要用到该连接的IoSession对象,而NIO是非阻塞式的,没法保证我们后面用到的IoSession是否已经存在;

        (5):通过ConnectFuture的getSession方法,获得当前连接的IoSession对象,接着我们便可以使用该对象进行一系列操作了;

        MinaClient.java

[java]  view plain  copy
  1. public class MinaClient {  
  2.     public static void main(String[] args) {  
  3.         MinaClient client = new MinaClient();  
  4.         client.initClient("127.0.0.1"9898);  
  5.     }  
  6.       
  7.     public void initClient(String host,int port)  
  8.     {  
  9.         NioSocketConnector connector = new NioSocketConnector();  
  10.         MinaClientHandler handler = new MinaClientHandler();  
  11.         connector.getFilterChain().addLast("codec"new ProtocolCodecFilter(new TextLineCodecFactory()));  
  12.         connector.setHandler(handler);  
  13.         ConnectFuture future = connector.connect(new InetSocketAddress(host,port));//创建连接  
  14.         future.awaitUninterruptibly();//阻塞直到连接建立,因为我们后面要使用连接成功之后创建的Session对象来进行写数据的操作  
  15.         IoSession session = future.getSession();//获得Session对象  
  16.         session.write("hello world");  
  17.     }  
  18. }  
        MinaClientHandler.java

[java]  view plain  copy
  1. public class MinaClientHandler extends IoHandlerAdapter {  
  2.     @Override  
  3.     public void exceptionCaught(IoSession session, Throwable cause)  
  4.             throws Exception {  
  5.         System.out.println("exceptionCaught");  
  6.     }  
  7.   
  8.     @Override  
  9.     public void messageReceived(IoSession session, Object message)  
  10.             throws Exception {  
  11.         String receiverContent = (String)message;  
  12.         System.out.println(receiverContent);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void messageSent(IoSession session, Object message) throws Exception {  
  17.         System.out.println("messageSent");  
  18.     }  
  19.   
  20.     @Override  
  21.     public void sessionClosed(IoSession session) throws Exception {  
  22.         System.out.println("sessionClosed");  
  23.     }  
  24.   
  25.     @Override  
  26.     public void sessionCreated(IoSession session) throws Exception {  
  27.         System.out.println("sessionCreated");  
  28.     }  
  29.   
  30.     @Override  
  31.     public void sessionIdle(IoSession session, IdleStatus status)  
  32.             throws Exception {  
  33.         System.out.println("sessionIdle");  
  34.     }  
  35.   
  36.     @Override  
  37.     public void sessionOpened(IoSession session) throws Exception {  
  38.         System.out.println("sessionOpened");  
  39.     }  
  40. }  

        在测试中,客户端向服务端发送了"hello world",服务端在收到之后将消息输出到控制台,同时向客户端回送了"Server has received message",接着我们分别运行服务端和客户端,可以看到下面输出信息:

        服务端:

 

        客户端:

 

        以上就是MINA的基本用法了,在下一篇博客我将带大家看看MINA的源码,这篇先写到这里啦!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值