浅谈Mina框架

article/2025/10/1 16:30:34

一、简介

Apache Mina Server 是一个网络通信应用框架,也就是说, 也可以提供JAVA对象的序列化服务、虚拟机管道通信服务等),Mina可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina提供了事件驱动、异步(Mina的异步IO默认使用的是JAVA NIO作为底层支持)操作的编程模型。Mina主要有1.x和2.x两个分支。学习mina,需要已掌握JAVA IO、JAVA NIO、JAVASocket、 JAVA线程及并发(java.util.concurrent.*)的知识。Mina同时提供了网络通信的Server端、Client端的封装。Mina的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。
二、过程在这里插入图片描述
当客户端向这一端口发送消息,IoService会监听这个端口,并经过过滤链进行处理后,传给IoHandler,在这个处理器中有很多函数,这些函数会在不同情况下触发(连接建立时、接收到消息时、连接关闭时、连接超时时等等)。你需要重写你需要的方法,在里面编写你的业务逻辑。
在这里插入图片描述
Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:可见Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。同样的,无论是哪端,Mina 的执行流程如下所示:

三、常用类以及方法
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,

常用的方法有:
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发

四、使用步骤
1.导包
2.服务端
步骤:
1.创建IOService的实例
2.创建过滤链
3…设置处理器 重写需要的方法,在里面编写业务逻辑。是业务处理的地方
4.监听接口

package mina_0826;import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.FilterEvent;
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.Charset;public class MInaServer {
//服务器public static void main(String[] args) throws IOException {//1.创建IOService的实例//监听这个接口IoAcceptor acceptor = new NioSocketAcceptor();//2.创建过滤链acceptor.getFilterChain().addLast("logger",new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//3.设置处理器 重写需要的方法,在里面编写业务逻辑。业务处理的地方acceptor.setHandler(new TimeServerHander());//4.让其监听某个端口acceptor.bind(new InetSocketAddress(9999));System.out.println("服务器开启");
}
}class TimeServerHander extends IoHandlerAdapter {public TimeServerHander() {super();
}@Override
public void sessionCreated(IoSession session) throws Exception {super.sessionCreated(session);System.out.println("服务器:会话通道创建");
}@Override
public void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println("服务器:会话打开");
}@Override
public void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("服务器:会话关闭");
}@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {super.sessionIdle(session, status);System.out.println("服务器:会话休眠");
}@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {super.exceptionCaught(session, cause);System.out.println("服务器:有异常出现!");
}@Override
public void messageReceived(IoSession session, Object message) throws Exception {super.messageReceived(session, message);System.out.println("服务器:接收信息");
}@Override
public void messageSent(IoSession session, Object message) throws Exception {super.messageSent(session, message);System.out.println("服务器:发送信息");
}@Override
public void inputClosed(IoSession session) throws Exception {super.inputClosed(session);System.out.println("服务器:输入关闭!");
}
}

客户端:
步骤:
1.实例化连接器
2.设置过滤链
3.处理器
4.进行连接

package mina_0826;import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.FilterEvent;
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.NioSocketConnector;import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.sql.Connection;public class MInaClient {
public static void main(String[] args) {//1.连接器,NioSocketConnector connector = new NioSocketConnector();//2.设置过滤链connector.getFilterChain().addLast("logger",new LoggingFilter());connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//3.设置处理器connector.setHandler(new MyClientHandler());//4.连接地址ConnectFuture connect =connector.connect(new InetSocketAddress("localhost",9999));System.out.println("客户端已连接!");
}

}

class MyClientHandler extends IoHandlerAdapter {
public MyClientHandler() {super();
}@Override
public void sessionCreated(IoSession session) throws Exception {super.sessionCreated(session);session.write("你好,服务器!");System.out.println("客户端:会话被创建!");
}@Override
public void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println("客户端:会话打开!");}@Override
public void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("客户端:会话关闭!");
}@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {super.sessionIdle(session, status);System.out.println("客户端:会话休眠!");
}@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {super.exceptionCaught(session, cause);System.out.println("客户端:有异常出现!");
}@Override
public void messageReceived(IoSession session, Object message) throws Exception {super.messageReceived(session, message);System.out.println("客户端:接收信息!");
}@Override
public void messageSent(IoSession session, Object message) throws Exception {super.messageSent(session, message);System.out.println("客户端:发送信息!"+message);}@Override
public void inputClosed(IoSession session) throws Exception {super.inputClosed(session);System.out.println("客户端:输入关闭!");
}
}

五、总结
优点:采用非阻塞方式的异步传输;


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

相关文章

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

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

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…