java mina框架实例_Apache Mina框架实践

article/2025/10/1 17:56:22

1.为什么要用Apache Mina框架

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

2.ApacheMina框架使用

Mina的执行流程:

> IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。

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

>IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。

>IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。

3.ApacheMina框架实例

该实例是WIFI云管理平台的实际运用,主要实现通过和WIFI保持长连接管理WIFI,贴出部分代码:

>服务器端UDPDispatcher.java

public class UDPDispatcher extendsHttpServlet implements ServletContextListener{

private static final int PORT =20000;

/** 30秒后超时 */

private static final int IDELTIMEOUT =30;

private static final longserialVersionUID = -4384594559203991221L;

@Override

public voidcontextInitialized(ServletContextEvent sce) {

NioDatagramAcceptor acceptor = newNioDatagramAcceptor();// 创建一个UDP的接收器

acceptor.setHandler(newUDPHandler());// 设置接收器的处理程序

Executor threadPool = newOrderedThreadPoolExecutor(100);// 建立线程池

acceptor.getFilterChain().addLast("exector",newExecutorFilter(threadPool));

acceptor.getFilterChain().addLast("logger",new LoggingFilter());

/*******心跳请求设置 begin*********/

KeepAliveMessageFactoryheartBeatFactory = new KeepAliveMessageFactoryImpl();

KeepAliveFilter heartBeat = newKeepAliveFilter(heartBeatFactory,

IdleStatus.BOTH_IDLE,KeepAliveRequestTimeoutHandler.CLOSE);

//设置是否forward到下一个filter

heartBeat.setRequestTimeoutHandler(newKeepAliveRequestTimeoutHandlerImpl());

heartBeat.setForwardEvent(true);

//设置心跳频率

heartBeat.setRequestInterval(20);

heartBeat.setRequestTimeout(60);

acceptor.getFilterChain().addLast("heartbeat",heartBeat);

/*******心跳请求设置 end  *********/

DatagramSessionConfig dcfg =acceptor.getSessionConfig();// 建立连接的配置文件

dcfg.setReadBufferSize(4096);// 设置接收最大字节默认2048

dcfg.setReceiveBufferSize(1024);//设置输入缓冲区的大小

dcfg.setSendBufferSize(1024);// 设置输出缓冲区的大小

dcfg.setReuseAddress(true);// 设置每一个非主监听连接的端口可以重用

dcfg.setIdleTime(IdleStatus.BOTH_IDLE,IDELTIMEOUT);

try {

// 绑定端口

acceptor.bind(newInetSocketAddress(UDPConfigUtil.getHost(),PORT));

} catch (IOException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

}

@Override

public voidcontextDestroyed(ServletContextEvent sce) {

// TODO Auto-generated method stub

}

}

>心跳机制处理KeepAliveMessageFactoryImpl.java

public void messageSent(IoSessionsession, Object message) throws Exception {

}

@Override

public void exceptionCaught(IoSessionsession, Throwable cause)

throws Exception {

logger.error(cause);

session.close(true);

}

@Override

public voidmessageReceived(IoSessionsession, Object message) throws Exception {

logger.info("messageReceived");

if (message instanceof IoBuffer) {

IoBuffer buffer = (IoBuffer)message;

UDPRequestServer controller =UDPRequestServer.getInstance();

IoBuffer buffer1 =controller.dealRequest(buffer);

session.write(buffer1);

}

}

}

>业务逻辑处理UDPHandler.java

publicclass UDPHandler extends IoHandlerAdapter {

private final Logger logger =Logger.getLogger(this.getClass());

@Override

public void messageSent(IoSessionsession, Object message) throws Exception {

}

@Override

public void exceptionCaught(IoSessionsession, Throwable cause)

throws Exception {

logger.error(cause);

session.close(true);

}

@Override

public void messageReceived(IoSessionsession, Object message) throws Exception {

logger.info("messageReceived");

if (message instanceof IoBuffer) {

IoBuffer buffer = (IoBuffer) message;

UDPRequestServer controller = UDPRequestServer.getInstance();

IoBuffer buffer1 =controller.dealRequest(buffer);

session.write(buffer1);

}

}

}

注意点:

>心跳机制:

(1)客户端会定时发送心跳请求(注意定时时间必须小于,服务器端的IDLE监控时间),同时需要监听心跳反馈,以此来判断是否与服务器丢失连接。对于服务器的心跳请求不给与反馈。

(2)心跳情况在60秒之内

(3)客户端和服务端同时都需要设置心跳请求

0b1331709591d260c1c78e86d0c51c18.png


http://chatgpt.dhexx.cn/article/jH40SZ3S.shtml

相关文章

mina框架详解-小白收藏

目录 mina框架详解 1 简介 1.1 工作流程 1.2 服务端流程 2 简单的TCPServer 3 简单的TCPClient 4 介绍Mina的TCP的主要接口 5 日志配置 6 过滤器 7 协议编解码器 8 线程模型配置 mina框架详解 1 简介 Apache Mina Server 是一个网络通信应用框架,也就是…

Mina网络通信框架

认识 Mina Apache Mina Server 是一个网络通信应用框架,与 Netty 出自同一作者,Netty 借鉴了部分 Mina 的设计思路。 Mina 主要是对基于 TCP/IP、UDP/IP 协议栈的通信框架,Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用&#x…

MINA框架

MINA框架 一、小程序MINA框架分为三个部分: 有 View(视图层)、App Service(逻辑层)和 Natice(系统层)。 1、View(视图层) 视图层包含了小程序多个页面、每个页面都有WXML文件和 WXSS文件,是搭建页面视图的结构和展现样式。 2、App Service(逻辑层) …

图文详解mina框架

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步…

要点初见:用Python进行微观交通模型仿真——基于SUMO的伯克利开源项目Flow Project初探与拓展

后续拓展:要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接) 通俗来讲,微观交通模型仿真就是从车辆个体的视角(看动画)进行交通流仿真,对车辆个体随时间、空间的…

爬取豆瓣电影TOP100

爬虫 首先我们在网站中打开我们要爬的网站 “http://maoyan.com/board/4” 这就是豆瓣高分电影前100的榜单. 然后我们点击f12,再刷新一次,就可以看到网页的基本信息了。 这时候我们来看一下第一部‘我不是药神中的代码信息。’ 一个dd节点为一个电影的…

2020 年软件设计师考试上午真题

2020 年软件设计师考试上午真题答案解析 1、在程序执行过程中,高速缓存(Cache) 与主存间的地址映射由(D )。 A、操作系统进行管理 B、存储管理软件进行管理 C、程序员自行安排 D、硬件自动完成 解:CACHE与主存地址映射由硬件完成…

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来。需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善。 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM…

基于LLVM的编译原理简明教程: 写一个自己的编译器​

LLVM简介 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来。需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善。 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件。…

【极富参考价值!】第1章 ClickHouse 简介《ClickHouse 企业级大数据分析引擎实战》...

《ClickHouse 企业级大数据分析引擎实战》全书目录 目录 第1章 ClickHouse 简介 第2章 MergeTree 表存储引擎 第3章 ClickHouse SQL 执行原理 第4章 分布式的 ClickHouse:集群、分片、副本 第5章 项目实战:Spring Boot 集成 ClickHouse 第6章 ClickHouse 函数 第7章 集成外部…

32.3-5带有通配符的匹配(自动机)

功能 这个程序可以判断一个带有通配符*的模式串是否在文本串中存在,没有记录位置信息,当然,想记录也是可以的 样例输入: abccbacbababc ab*bab*c 样例输出: 1 思路 对于样例输入,有限自动机如图所示: 我们把每个通配符隔开的字串看做独立的,在其上运行KMP算法的comput_s…

自己动手写编译器:代码实现正则表达式到NFA状态机

在编译器开发中有两个非常重要的工具名为lex和yacc,他们是编译器的生成器。本质上我们不需要一行行去完成编译器的代码,只需要借助这两个工具,同时制定好词法解析和语法解析的规则后,这两个工具就会自动帮我们把代码生成&#xff…

mac搭建网站服务器,Mac上搭建Web服务器--Apache

局域网搭建 Web 服务器测试环境,因为Mac OS X 自带了 Apache 和 PHP 环境,我们只需要简单的启动它就行了。 1.命令:sudo apachectl start Apache服务器默认的web根目录在:/Library/WebServer/Documents Apache的配置文件在:/etc/apache2 相关命令: 停止 Apache:sudo apac…

aText for Mac(打字加速器)

aText作为一款文字效率的工具,对于文字工作者来说这款软件的目的是为了减少你在文字输入的过程当中的重复性,这款试用版本能够让你体验到一些较为基础的功能。 aText下载安装教程 镜像包下载完成后打开,双击.pkg按照安装引导器进行安装即可&a…

共享文件夹无法打开——服务器存储空间不足,无法处理此命令

原文地址为: 共享文件夹无法打开——服务器存储空间不足,无法处理此命令 共享某个文件夹后在网上邻居打开它,提示:“服务器存储空间不足,无法处理此命令”,如下图: 查看系统日志显示&#xff1…

彻底解决win10 docker desktop镜像过大导致“C盘存储空间不足”的问题。

彻底解决win10 docker desktop镜像过大导致“C盘存储空间不足”的问题。 win10安装docker只需要双击安装包,真正实现了傻瓜式安装,这一点真的十分方便!不过用了义端时间docker后,突然有一天我注意到C盘原本充裕的空间容量&#x…

mysql数据库空间不足_mysql空间不足怎么解决?

磁盘空间不足,使用du命令察看 du -h --max-depth1 当前目录下占空间比较大的是104个mysql-bin.00000X 和ibdata1。 mysql数据目录下有大量的mysql-bin.00000X文件,这些文件是做什么的呢? 这是数据库的操作日志,例如UPDATE一个表&a…

ubuntu提示根目录存储空间不足的解决办法

因为每次使用系统都会产生大量的日志文件,如果没有设置自动清理日志文件或者分区较小,日志文件在一段时间的堆积后就会导致存储空间不足,所以需要清除日志文件。以下是清除步骤: 1、切换为超级用户 su2、查看日志文件大小 du &am…

ES存储空间不足导致索引read-only解决

在es存储数据的时候报了这个错,然后网上都说是磁盘不够了,一看果然是磁盘剩余不足5个G了。。。 解决方案 1- 最简单的也就是清理下磁盘空间。 2- 更改elasticsearch.yml配置文件。在配置文件后加上: cluster.routing.allocation.disk.wate…

如何解决IIS配置报错问题:存储空间不足?

如何解决IIS配置报错问题:存储空间不足 存储空间不足;并导致IIS安装失败 服务器说明: 当前服务器为阿里云服务器操作系统:windows services 2008 R2基本配置: 1G内存 20G40G存储盘服务器尚未安装配置IIS **“存储空间…