MINA 学习记录(二)

/

说完了简单的编写一个客户端,服务端程序后。发现MINA还是为开发者省了大量的活,那一起来看看MINA自身是怎样工作呢。

先上张MINA整体工作流程的图

先看下图中提到的接口的大体结构吧

这样可能看着还可能不太明白那还慢慢的通过追溯源码的方式来说明这个图。

  1. public class TcpServer extends IoHandlerAdapter{
  2. public static final int PORT=6058;
  3. public TcpServer() {
  4. NioSocketAcceptor acceptor=new NioSocketAcceptor();
  5. try {
  6. acceptor.setHandler(this);
  7. acceptor.bind(new InetSocketAddress(PORT));
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }

帖的代码中可以看到我们的代码是从IoHandlerAdapter开始的,通过观看类图可以发现 IoHandlerAdapter 是实现了 IoHandler的,那么接下来有做了什么,是通过 NioSocketAcceptor 创建了一个实例,TcpServer作为handler,最后在绑定一个Tcp的端口号,就完成一个服务端程序简单的搭建。


怎么一点也看到有监听的代码?
追踪源码发现在 acceptor(IoServices) 做了大量的事情。通过setHandler将IoServices 收到的请求交了自己代码处理请求。也就是说在创建的过程中是由
IoServices -> IoHandler 进行工作的。
可是请求收到了又是那样
就如图上的
IoServices -> IoProcssor -> IoFilter -> IoHandler
通过IoProcessor得到连接后将创建IoSession传递到IoFilter 里面依次会进入默认的IoFilter(默认的线程池,默认的编码器等)。由IoFilter最后一个过滤
调用write将消息传递到IoHandler 完成一次消息接受。






然而在发送消息的时候就会通过IoSession.write() 的方式发送就可以了。
程序先会取得FilterChain然后依次执行。这里和接受时候的顺序相反。

总结

源代码中各种封装。一段简单的Nio绑定端口的代码就做了很多的事(大多是为了支撑框架)为了将业务分开吧。将端口绑定交个IoServices处理,然后构建基础线程用来处理请求响应。通过调用NioProcessor 的init方式开始处理selector进行消息的内容。然后构建一个IoSession 用来标记这个链接。依次通过IoFilter,IoHandler 通过IoSession 来让程序隔离业务代码。只用简单调用write,编写适合自己业务代码Filter就能发送自己需要的数据格式了。 不得不说mina整体是不错的。让复杂的Nio代码(selector使用handler,进行事件的回调,编码过滤器来处理各种不同的通信格式来替换byteBuffer这种烦人的操作。)程序在编写的过程中不用关心IoSerices,IoProcessor的具体实现。

PS 想学习NIO可以看下这个

基于NIO的简单web服务器 源码有基础NIO 代码以及TCP数据粘包的处理的代码。

转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/mina-core-code-analysis.html