1. Mina简介

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它是一个网络通信应用框架,为开发高性能和高可用性的网络应用程序提供了非常便利的框架。

也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等)。

Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。

Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,那么可能会有一些功能并不适用。学习Mina,需要你已掌握JAVA IO、JAVA NIO、JAVASocket、JAVA 线程及并发库(java.util.concurrent.*)的知识。

Mina 同时提供了网络通信的Server 端、Client 端的封装。无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:可见Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。

同样的,无论是哪端,Mina 的执行流程如下所示:


2. Mina总体框架

基于MINA框架的应用程序架构应该是这样的:

2.1 Mina的核心部分架构

Mina的底层是基于JAVA的NIO 1.0实现的,其核心部分架构是这样的:

2.2 基于Mina的应用程序

基于Mina的应用程序分为3层:

  • I/O Service - 执行实际的I / O,可以选择现成的Services如 (*Acceptor),也可以自己写。
  • I/O Filter Chain - 这是一个由多个过滤器组成的过滤器链,在这个环节,将字节数据转换到特定的数据结构中(Filters/Transforms bytes into desired Data Structures and vice-versa)
  • I/O Handler - 完成实际的业务逻辑部分

3. 基于MINA框架的Server端应用

对socket通信来说,使用比较广泛的是基于Server端的应用,尤其是并发规模达到一定程度后,颇具挑战性。

那么我们如何创建一个基于Mina的应用程序呢?

  1. Create I/O service:从现有的Service(*Accept)中选择一个或者创建自己的
  2. Create I/O Filter Chain:从现有的Filter中选择或创建一个传输request/response的自定义Filter
  3. Create I/O Handler:编写业务逻辑,处理不同的报文

那么我们来看一下,基于MINA框架的Server端应用:

  1. IOAcceptor 监听指定的端口,处理新的网络连接;一旦一个新的连接到达后,IOAcceptor 就产生一个session,后续所有从这个IP和端口发送过来的请求就将通过这个Session被处理。
  2. Session创建后,后续所有的数据包都被人到过滤器链中,通过过滤器将原始的字节码转变成高层的对象,这个环节PacketEncoder/Decoder就十分有用。
  3. 最后数据包或对象被传送给Handler做业务逻辑处理;

3.1 前置条件

在开始进入 MINA 的应用程序开发的大门之前,我们需要具备下面的必要条件:

  • MINA 2.x 的核心包
  • JDK 1.5 或更高版本
  • SLF4J 1.3.0 或更高版本
  1. Log4J 1.2 的用户:slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
  2. Log4J 1.3 的用户:slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
  3. java.util.logging 的用户:slf4j-api.jar and slf4j-jdk14.jar

注意:

请务必确认你所使用的 slf4j-*.jar 要与你的日志框架相匹配。

例如,slf4j-log4j12.jar 和log4j-1.3.x.jar 不能在一起使用,否则会引起混乱。

3.2 举个栗子

pom.xml中Mina的依赖配置:

<dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.0.7</version>
</dependency>

Mina.java

package com.hl.magic.mina;import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;/*** @Date 2021/10/10 21:00*/
public class Mina {/*** 自定义端口*/private static final int PORT = 54321;public static boolean connect() {try {IoAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("logger", new LoggingFilter());acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(StandardCharsets.UTF_8)));acceptor.setHandler(new TimeServerHandler());acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);acceptor.bind(new InetSocketAddress(PORT));return true;} catch (IOException e) {e.printStackTrace();return false;}}/*** @param args the command line arguments*/public static void main(String[] args) {boolean connect = connect();System.out.println("连接:" + connect);}
}
  1. 创建IoAcceptor;
  2. 加入日志记录和解码的过滤器,其中日志过滤器用SL4J库记录信息,而编码过滤器则解码所有收到的信息。使用 new TextLineCodecFactory() 发送的信息迕行编码,返是MINA自带的,功能有限,只能处理文本戒者String类型。
  3. 设置ServerHandler,这里是一个自定义的Handler:TimeServerHandler;
  4. 设置Session的对应的I/O processor 读缓存区大小2048;通常这个参数不需要设置;
  5. 设置空闲时间,这里的BOTH_IDLE指EADER_IDLE 和 WRITER_IDLE. 都为10秒;
  6. 绑定监听端口54321;

TimeServerHandler.java:

package com.hl.magic.mina;import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;import java.util.Date;/*** @Date 2021/10/10 21:06*/
public class TimeServerHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause) {cause.printStackTrace();}@Overridepublic void messageReceived(IoSession session, Object message) {String str = message.toString();if (str.trim().equalsIgnoreCase("quit")) {session.close();return;}Date date = new Date();session.write(date.toString());System.out.println("Message written...");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status) {System.out.println("IDLE " + session.getIdleCount(status));}
}

这里主要有一下几个主要的方法:

messageReceived(…),对接收到的消息(已经解码)迕行下一步处理,这里对收到的字符串进行判断,如果是”quit”则断开连接;否则输出当前时间的字符串格式;

exceptionCaught(…),自定义异常处理, 要不然异常会被“吃掉”;

sessionIdle,当Session处于IDLE状态的时候,输出空闲状态次数;

测试结果:

测试,运行CMD,在窗口输入:telnet 127.0.0.1 54321

然后在CMD窗口上随便输入一串字符串,显示当前的时间:

Mina(1):快速上手相关推荐

  1. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  2. 【转】Vue.js 2.0 快速上手精华梳理

    Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...

  3. 『转载』Debussy快速上手(Verdi相似)

    『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...

  4. [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证

    ESFramework 4.0 快速上手(15) -- 客户端登录验证 在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实 ...

  5. WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...

  6. react 快速上手开发_React中测试驱动开发的快速指南

    react 快速上手开发 by Michał Baranowski 通过MichałBaranowski React中测试驱动开发的快速指南 (A quick guide to test-driven ...

  7. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...

    1-3 Android Studio 快速上手

  8. Keras快速上手:基于Python的深度学习

    Keras快速上手:基于Python的深度学习 谢梁,鲁颖,劳虹岚 著 ISBN:9787121318726 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2017-0 ...

  9. 快速上手关键词抽取的算法

    前言 在自然语言处理领域,我们有一种类型的问题是如何在一堆文本中提取出核心词/句子.而无论是对于长文本还是短文本,往往几个关键词就可以代表整个文本的主题思想.同时,在很多推荐系统中,由于无法直接就整体 ...

  10. Python学习六大路线,教你快速上手

    最近几年随着互联网的发展学习Python人越来越多,Python的初学者总希望能够得到一份Python学习路线图,小编经过多方面汇总,总结出比较全套Python学习路线,快速上手.对于一个零基础的想学 ...

最新文章

  1. Windows下 maven3.0.4的安装步骤+maven配置本地仓库(转载)
  2. 进程线程002 等待链表 调度链表
  3. MySQL同步状态双Yes的假象及seconds_behind_master的含义
  4. 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议
  5. VMware 虚拟机安装OSX el capitan 11.12
  6. linux nuc 吗 支持_在你的树莓派家庭实验室中使用 Cloudinit | Linux 中国
  7. asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)
  8. UESTC_神秘绑架案 CDOJ 881
  9. 潜在失效模式和后果分析 FMEA 10分钟教程
  10. 改变TMQQ2009版消息提示音
  11. 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
  12. Java基于POI来给导出的Excel动态添加水印
  13. 华为培养新员工的方案,值得收藏
  14. CSDN调整文章图片
  15. python引入视频_django 实现简单的插入视频
  16. ESP32开发环境的搭建和 ESP-IDF支持以下调试方法
  17. 潜在语义索引(LSI)
  18. 水果姿态估计论文、数据集汇总
  19. [diary]发现Debbie 越来越无聊了
  20. 【射影几何03】中心射影和透视射影

热门文章

  1. [小知识] 关于Excel中行列的固定
  2. MyBatis源码阅读(八) --- Executor执行器
  3. ElasticSearch全文搜索引擎之入门以及环境搭建
  4. spring扩展点四:SmartInitializingSingleton 补充
  5. 苦劝学弟学妹们,explain一定要学明白,以后有大用途
  6. Linux学习第八篇之文件搜索命令find、locate、which、whereis、grep
  7. 新零售引发全球关注 阿里巴巴获零售业年度全球最大奖
  8. 有没有知道如何连接DB2的数据库?
  9. linux系统修改时区的方法
  10. Github上十大C#开源项目排行榜