Mina(1):快速上手
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的应用程序呢?
- Create I/O service:从现有的Service(*Accept)中选择一个或者创建自己的
- Create I/O Filter Chain:从现有的Filter中选择或创建一个传输request/response的自定义Filter
- Create I/O Handler:编写业务逻辑,处理不同的报文
那么我们来看一下,基于MINA框架的Server端应用:
- IOAcceptor 监听指定的端口,处理新的网络连接;一旦一个新的连接到达后,IOAcceptor 就产生一个session,后续所有从这个IP和端口发送过来的请求就将通过这个Session被处理。
- Session创建后,后续所有的数据包都被人到过滤器链中,通过过滤器将原始的字节码转变成高层的对象,这个环节PacketEncoder/Decoder就十分有用。
- 最后数据包或对象被传送给Handler做业务逻辑处理;
3.1 前置条件
在开始进入 MINA 的应用程序开发的大门之前,我们需要具备下面的必要条件:
- MINA 2.x 的核心包
- JDK 1.5 或更高版本
- SLF4J 1.3.0 或更高版本
- Log4J 1.2 的用户:slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
- Log4J 1.3 的用户:slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
- 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);}
}
- 创建IoAcceptor;
- 加入日志记录和解码的过滤器,其中日志过滤器用SL4J库记录信息,而编码过滤器则解码所有收到的信息。使用 new TextLineCodecFactory() 发送的信息迕行编码,返是MINA自带的,功能有限,只能处理文本戒者String类型。
- 设置ServerHandler,这里是一个自定义的Handler:TimeServerHandler;
- 设置Session的对应的I/O processor 读缓存区大小2048;通常这个参数不需要设置;
- 设置空闲时间,这里的BOTH_IDLE指EADER_IDLE 和 WRITER_IDLE. 都为10秒;
- 绑定监听端口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):快速上手相关推荐
- 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)
本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...
- 【转】Vue.js 2.0 快速上手精华梳理
Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...
- 『转载』Debussy快速上手(Verdi相似)
『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...
- [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证
ESFramework 4.0 快速上手(15) -- 客户端登录验证 在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实 ...
- WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...
- react 快速上手开发_React中测试驱动开发的快速指南
react 快速上手开发 by Michał Baranowski 通过MichałBaranowski React中测试驱动开发的快速指南 (A quick guide to test-driven ...
- 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...
1-3 Android Studio 快速上手
- Keras快速上手:基于Python的深度学习
Keras快速上手:基于Python的深度学习 谢梁,鲁颖,劳虹岚 著 ISBN:9787121318726 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2017-0 ...
- 快速上手关键词抽取的算法
前言 在自然语言处理领域,我们有一种类型的问题是如何在一堆文本中提取出核心词/句子.而无论是对于长文本还是短文本,往往几个关键词就可以代表整个文本的主题思想.同时,在很多推荐系统中,由于无法直接就整体 ...
- Python学习六大路线,教你快速上手
最近几年随着互联网的发展学习Python人越来越多,Python的初学者总希望能够得到一份Python学习路线图,小编经过多方面汇总,总结出比较全套Python学习路线,快速上手.对于一个零基础的想学 ...
最新文章
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库(转载)
- 进程线程002 等待链表 调度链表
- MySQL同步状态双Yes的假象及seconds_behind_master的含义
- 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议
- VMware 虚拟机安装OSX el capitan 11.12
- linux nuc 吗 支持_在你的树莓派家庭实验室中使用 Cloudinit | Linux 中国
- asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)
- UESTC_神秘绑架案 CDOJ 881
- 潜在失效模式和后果分析 FMEA 10分钟教程
- 改变TMQQ2009版消息提示音
- 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
- Java基于POI来给导出的Excel动态添加水印
- 华为培养新员工的方案,值得收藏
- CSDN调整文章图片
- python引入视频_django 实现简单的插入视频
- ESP32开发环境的搭建和 ESP-IDF支持以下调试方法
- 潜在语义索引(LSI)
- 水果姿态估计论文、数据集汇总
- [diary]发现Debbie 越来越无聊了
- 【射影几何03】中心射影和透视射影
热门文章
- [小知识] 关于Excel中行列的固定
- MyBatis源码阅读(八) --- Executor执行器
- ElasticSearch全文搜索引擎之入门以及环境搭建
- spring扩展点四:SmartInitializingSingleton 补充
- 苦劝学弟学妹们,explain一定要学明白,以后有大用途
- Linux学习第八篇之文件搜索命令find、locate、which、whereis、grep
- 新零售引发全球关注 阿里巴巴获零售业年度全球最大奖
- 有没有知道如何连接DB2的数据库?
- linux系统修改时区的方法
- Github上十大C#开源项目排行榜