Mina异步IO使用的Java底层JNI框架,Mina提供服务端和客户端,将我们的业务解耦开发.真正做到高内聚低耦合的思想

核心类

  • IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这个接口的作用就是用来处理套接字机制。也正是IoService来监听消息返回消息这些步骤,

    可以说IoService就是我们Mina中核心

  • IoProcessor:这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler

  • IoFilter : 定义了一些拦截器 , 和我们web中拦截器一样,用来横向拦截处理一些全局的操作(日志处理,编码处理)。其中我们必须注意的是加解密消息。

    作为一个好的框架肯定是有默认的拦截器的(TextLineCodecFactory )。默认拦截器可以叫消息强制转换为String类型。毕竟String最通用

  • IoHandler : 这个是我们处理消息的逻辑,前面的拦截器只是在接受是进行一些验证、翻译的功能。拿到数据之后我们需要做的事情就是在IoHandler中

各个击破

IoService

  • 首先我们已服务端NioSocketAcceptor为列,看看我们的服务类之间的结构依赖关系

  • IoService是服务的鼻祖,无论在我们看来的服务端还是客户端都得继承它(间接继承)。在IoService中我们会定义我们消息的处理过滤器(上文的拦截器),消息处理的业务类

    在上文简介中我们知道,这一步其实是IoProcessor来完成,那么IoProcessor在什么出现呢。比如Mina框架中用来创建服务端类NioSocketAcceptor。他直接继承了AbstractPollingIoAcceptor。而AbstractPollingIoAcceptor类中根据参数创建了我们需要的IoProcessor.从而我们有了IoProcessor就可以执行消息间的通信了。

  • 所以过滤器、处理器实在我们服务启动之前配置好的。一旦启动成功就无法再修改了。我们服务端NioSocketAcceptor通过bind方法就可以绑定到指定端口上。我们这里的绑

    定实现了多态绑定。我们可以绑定多个服务。


/**
* {@inheritDoc}
*/
@Override
public final void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException {
if (isDisposing()) {
throw new IllegalStateException("The Accpetor disposed is being disposed.");
} if (localAddresses == null) {
throw new IllegalArgumentException("localAddresses");
} List<SocketAddress> localAddressesCopy = new ArrayList<>(); for (SocketAddress a : localAddresses) {
checkAddressType(a);
localAddressesCopy.add(a);
} if (localAddressesCopy.isEmpty()) {
throw new IllegalArgumentException("localAddresses is empty.");
} boolean activate = false;
synchronized (bindLock) {
synchronized (boundAddresses) {
if (boundAddresses.isEmpty()) {
activate = true;
}
} if (getHandler() == null) {
throw new IllegalStateException("handler is not set.");
} try {
Set<SocketAddress> addresses = bindInternal(localAddressesCopy); synchronized (boundAddresses) {
boundAddresses.addAll(addresses);
}
} catch (IOException | RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeIoException("Failed to bind to: " + getLocalAddresses(), e);
}
} if (activate) {
getListeners().fireServiceActivated();
}
}

在上面我们可以看到bind最后是去激活对应的监听器。我们一个IoServer处理一个线程中的消息。我们监听器就是监听线程内的消息。每一次的绑定都会有不同的监听器、ioSession去专门处理消息之间的通信。我们可以通过IoSession设置一些请求数据完成数据的权限验证。

  • 在服务创建的时候我们正常需要设置IoSession的一些配置。通过getSessionConfig方法获取IoSessionConfig。里面设置参数常用如下:

    • setReadBufferSize : 设置读取数据的缓冲区大小
    • setMinReadBufferSize: 设置缓冲区最大值
    • setMaxReadBufferSize: 设置缓冲区最小值
    • setThroughputCalculationInterval: 设置通道计算时间 默认3s
    • setIdleTime(IdleStatus status, int idleTime): status 设置是一方还是双方 , idLetime 是超过多久就会进入空闲状态
IoAcceptor acceptor=new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);

IoFilter

在IoService中有获取filter链的一个方法 DefaultIoFilterChainBuilder getFilterChain() , 我们需要做的就是定义过滤器,然后通过该方法获取过滤链加入到请求链上。

我们自定义过滤器也很简单,只需要继承IoFilterAdapter这个类就好了。

  acceptor.getFilterChain().addLast("codec",  new ProtocolCodecFilter(new TextLineCodecFactory(
Charset.forName("UTF-8"),LineDelimeter.WINDOWS.getValue(),LineDelimiter. WINDOWS.getValue()))
);

TextLineCodecFactory 这个类是Mina提供的编解码工厂,这个工厂的特性是以换行符'\r\n'为结束通信的标志。也就是说如果我们传递消息没有换行符,另外一段会继续

接受消息知道接受到'\r\n'才会接受,并把接受到的消息通过编解码器转到IoHandler层供业务层处理。(这里博主被坑在这里了)

IoHandler

  • 到了这一步,我们的通信基本就已经完成了。剩下的事情已经和Mina基本没多大关联了。我们将在这里处理业务逻辑,使用到的就是Handler提供的接收消息和发送消息两个功能。

    这里我们需要注意的是Handler提供messageReceivedmessageSent并不是字面意思。前者就是消息的接受,但是后者并不是消息的发送。我们常用的发送消息是session.write方法。

总结

今天我们了解了Mina工作的流程,主要就是IoFilter和IoHandler实现消息的通信 。 千里之行始于足下,一点一点的进步。下面贴出一份总结的图谱帮助我们理解Mina流程

加入战队

# 加入战队

微信公众号

Socket通信封装MIna框架--含羞代放的更多相关文章

  1. C# .NET Socket 简单实用框架,socket组件封装

    参考资料 https://www.cnblogs.com/coldairarrow/p/7501645.html 根据.NET Socket 简单实用框架进行了改造,这个代码对socket通信封装还是 ...

  2. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  3. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  5. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  6. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  7. Java和C#的socket通信相关(转)

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  8. 摘录:MINA 框架简介

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mi ...

  9. MINA 框架总结 整体理解

    MINA是一套成熟的JAVA NIO 框架,在用到Socket通信的Java应用场景中经常会得到使用.其作者还有一套更加知名的框架Netty,其应用程度更加广泛.虽然不及Netty知名,Mina也是一 ...

随机推荐

  1. 算法学习笔记,几个简单的Demo

    算法初学的一些心得 前言:现在工作也快一年多了,有时间下班回家会学学算法,陆陆续续也接触了一些 貌似我知道的就冒泡排序其他的都不是很了解 最近买了一本书,边学边记录吧! 一些常用的方法 暴力破解 下面 ...

  2. Mysql 时间相关

    -- 当前时间SELECT NOW(), SYSDATE(), CURRENT_TIMESTAMP(), LOCALTIME(), LOCALTIMESTAMP();SELECT CURDATE(), ...

  3. maven install时跳过测试

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! - ...

  4. .NET 欢乐编程术之类型超级转换之术👍👍

    准备工作:先确保 VS 版本大于 2017,且支持C# 7.0 语言版本.然后新建 .Net Core 项目,在 Nuget 包管理上引入微软霸霸官方包 System.Runtime.Compiler ...

  5. Linux目录文件

    /binbin是binary的缩写.这个目录沿袭了UNIX系统的结构,存放着使用者最经常使用的命令.例如cp.ls.cat,等等. /boot这里存放的是启动Linux时使用的一些核心文件. /dev ...

  6. linux初学者-软件安装与管理篇

    linux初学者-软件安装与管理篇 在linux的学习和工作中需要安装许多的软件.在redhat的linux操作系统下,软件一般都是rpm格式的.以下将介绍一些软件安装和管理的内容. 1.软件名称 在 ...

  7. Office2010安装问题锦集

    问题一,每次打开office 2010,都会出现重新配置的对话框. 解决姿势: 大部分搜索到的解决方法大概有2种, 一个是修改注册表,在注册表中这个这个位置增加一个名为NoRereg的32位World ...

  8. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十五场

    传送门 A: Colorful Subsequence •题意 给一个长为n的小写字母序列,从中选出字母组成子序列 问最多能组成多少种每个字母都不相同的子序列 (不同位置的相同字母也算是不同的一种) ...

  9. 任何类型的数据都向String转型

    String从其定义上发现首字母大写,所以此为一个类,属于引用数据类型,但是此类属于系统的类. (1)String像普通变量一样直接通过复制的方式进行声明.字符串使用双引号括起来.两个字符串使用&qu ...

  10. 【iOS】Your account already has a valid ios

    打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...