当前位置: 首页 > news >正文

MINA架构DEMO

参考:Java中的MINA框架_java mina_小陈拾光的博客-CSDN博客

MINA:一个简洁易用的基于TCP/IP通信的JAVA框架。

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

先启动server,之后启动client,则首先server和client均会创建sessionCreated 和 sessionOpened,之后client发送消息:messageSent,cf.getSession().write(msg)

则server端,可以收到消息,之后server端发送,也是session.write(msg),messageSent。可参考如下:

 结果:Client端

Connected to the target VM, address: '127.0.0.1:62483', transport: 'socket'
MinaClientHandler-sessionCreated (0x00000001: nio socket, client, /127.0.0.1:62534 => localhost/127.0.0.1:9999)
MinaClientHandler-sessionOpened (0x00000001: nio socket, client, /127.0.0.1:62534 => localhost/127.0.0.1:9999)
MinaClientHandler-messageSent (0x00000001: nio socket, client, /127.0.0.1:62534 => localhost/127.0.0.1:9999)  Message{from='clientfrom', to='clientto', type='clientsend', info='clientinfo'}
16:44:28.700 [NioProcessor-2] DEBUG org.apache.mina.filter.codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1
MinaClientHandler-messageReceived (0x00000001: nio socket, client, /127.0.0.1:62534 => localhost/127.0.0.1:9999)  Message{from='serverFrom', to='serverTo', type='serversent', info='serverInfo'}

服务端:server:

Connected to the target VM, address: '127.0.0.1:62391', transport: 'socket'
Mina Server Running,Listener on : 9999
MinaServerHandler  sessionCreated (0x00000001: nio socket, server, /127.0.0.1:62534 => /127.0.0.1:9999)MinaServerHandler -sessionOpened  welcome client: /127.0.0.1:62534
16:44:28.684 [NioProcessor-2] DEBUG org.apache.mina.filter.codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1MinaServerHandler messageReceived 收到客户端发来的消息:(0x00000001: nio socket, server, /127.0.0.1:62534 => /127.0.0.1:9999) Message{from='clientfrom', to='clientto', type='clientsend', info='clientinfo'}
MinaServerHandler  messageSent (0x00000001: nio socket, server, /127.0.0.1:62534 => /127.0.0.1:9999)  Message{from='serverFrom', to='serverTo', type='serversent', info='serverInfo'}

如果Server不关闭,只关闭Client,则会向服务器发送:

MinaServerHandler-exceptionCaught (0x00000001: nio socket, server, /127.0.0.1:49956 => /127.0.0.1:9999)  java.io.IOException: 远程主机强迫关闭了一个现有的连接。
MinaServerHandler  client closed (0x00000001: nio socket, server, /127.0.0.1:49956 => 0.0.0.0/0.0.0.0:9999)

如果客户端不关闭,只关闭 服务端Server,则此时会在Client出现:

MinaClientHandler-exceptionCaught (0x00000001: nio socket, client, /127.0.0.1:50335 => localhost/127.0.0.1:9999)  java.io.IOException: 远程主机强迫关闭了一个现有的连接。
MinaClientHandler-sessionClosed (0x00000001: nio socket, client, 0.0.0.0/0.0.0.0:50335 => localhost/127.0.0.1:9999)

代码如下:

package mina;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Iterator;/***服务器*/
public class Server {public static void main(String[] args) {//创建一个非阻塞的Server端Socket  NIOSocketAcceptor acceptor = new NioSocketAcceptor();DefaultIoFilterChainBuilder Chain = acceptor.getFilterChain();//设定一个过滤器,一行一行的读取数据(/r/n)
//        Chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));//设定过滤器,以对象为单位来读取数据Chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));//设置服务端的消息处理器acceptor.setHandler(new MinaServerHandler());//定义端口号int port = 9999;try {//绑定端口,启动服务器(不会阻塞,立即返回)acceptor.bind(new InetSocketAddress(port));} catch (IOException e) {e.printStackTrace();}System.out.println("Mina Server Running,Listener on : "+port);}
}

package mina;import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;/**** <p>mina</p>** 类说明** @author duanxj* @version*/
public class MinaServerHandler extends IoHandlerAdapter{@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("MinaServerHandler-exceptionCaught "+session+"  "+cause);}//接收消息@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {super.messageReceived(session, message);//        String msg = (String) message;//接收到的消息对象Message msg = (Message)message;System.out.println(" MinaServerHandler messageReceived 收到客户端发来的消息:"+session+" "+msg);//向客户端发送消息对象msg.setFrom("serverFrom");msg.setTo("serverTo");msg.setType("serversent");msg.setInfo("serverInfo");session.write(msg);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("MinaServerHandler  messageSent "+session+"  "+message);}//会话关闭@Overridepublic void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("MinaServerHandler  client closed "+session);}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("MinaServerHandler  sessionCreated "+session);}@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("MinaServerHandler  sessionIdle "+session+"  "+status);}//一次会话被打开@Overridepublic void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println(" MinaServerHandler -sessionOpened  welcome client: "+session.getRemoteAddress());}
}
package mina;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;import java.net.InetSocketAddress;
import java.util.Scanner;/*** @date 2022/4/15--9:20* 客户端*/
public class Client {public static void main(String[] args) {//创建连接NioSocketConnector connector = new NioSocketConnector();DefaultIoFilterChainBuilder chain = connector.getFilterChain();
//        chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));//设定过滤器,以对象为单位来读取数据chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));connector.setHandler(new MinaClientHandler());connector.setConnectTimeoutMillis(10000);//连接服务器ConnectFuture cf =connector.connect(new InetSocketAddress("localhost",9999));cf.awaitUninterruptibly();//等待连接成功//Scanner input = new Scanner(System.in);//        while (true){
//            System.out.println("请输入:");
//            String info= input.nextLine();
//            //发送消息
//            cf.getSession().write(info);
//        }//以对象的方式传输数据Message msg = new Message();//System.out.println("from:");msg.setFrom("clientfrom");// System.out.println("To:");msg.setTo("clientto");// msg.setTo(input.nextLine());//System.out.println("info");;msg.setInfo("clientinfo");msg.setType("clientsend");cf.getSession().write(msg);//等待服务器连接关闭,结束长连接
//        cf.getSession().getCloseFuture().awaitUninterruptibly()//connector.dispose();}
}
package mina;import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;/*** @date 2022/4/15--9:21* 客户端消息处理器*/
public class MinaClientHandler extends IoHandlerAdapter {@Overridepublic void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println("MinaClientHandler-sessionOpened "+session);}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("MinaClientHandler-sessionCreated "+session);}@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("MinaClientHandler-sessionIdle "+session+"  "+status);}@Overridepublic void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("MinaClientHandler-sessionClosed "+session);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("MinaClientHandler-messageSent "+session+"  "+message);}@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("MinaClientHandler-exceptionCaught "+session+"  "+cause);}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception {super.messageReceived(session, message);
//        String msg = (String) message;Message msg = (Message) message;System.out.println("MinaClientHandler-messageReceived "+session+"  "+msg);}
}
package mina;import java.io.Serializable;/*** @date 2022/4/15--9:49*/
public class Message implements Serializable {private String from;private String to;private String type;private String info;public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}@Overridepublic String toString() {return "Message{" +"from='" + from + '\'' +", to='" + to + '\'' +", type='" + type + '\'' +", info='" + info + '\'' +'}';}
}

相关文章:

MINA架构DEMO

参考&#xff1a;Java中的MINA框架_java mina_小陈拾光的博客-CSDN博客 MINA&#xff1a;一个简洁易用的基于TCP/IP通信的JAVA框架。 <dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.1.5&…...

Linux基础:2:shell外壳+文件权限

shell外壳文件权限 一.shell原理&#xff1a;1.对比&#xff1a;windo GUI 和 shell1.windo GUI2. shell 2.为什么&#xff1f;是什么&#xff1f;怎么办&#xff1f;1.为什么有shell2.是什么&#xff1f;3.怎么办&#xff1f;4.补充&#xff1a; 二.linux权限管理&#xff1a;…...

webpack 解决:TypeError: merge is not a function 的问题

1、问题描述&#xff1a; 其一、存在的问题为&#xff1a; TypeError: merge is not a function 中文为&#xff1a; 类型错误&#xff1a;merge 不是函数 其二、问题描述为&#xff1a; 想执行 npm run dev 命令&#xff0c;运行起项目时&#xff0c;控制台报错 TypeErro…...

datahub 中血缘图的实现分析,在react中使用airbnb的visx可视化库来画有向无环图

背景 做大数据的项目&#xff0c;必不可少的是要接触到数据血缘图&#xff0c;它在大数据项目中有着很重要的作用。 之前在公司也做过一些案例&#xff0c;也看过很多友商的产品&#xff0c;阿里的DataWork&#xff0c;领英的Datahub&#xff0c; datawork的血缘图使用的是 G6…...

二、判断语句

文章目录 1.if语句1&#xff09;if判断语句基本格式2&#xff09; 网吧上网3&#xff09;if语句使用逻辑运算 2.if-else语句1&#xff09;if-else的使用格式2&#xff09;网吧上网 3.多重判断elif语句1&#xff09; 多重判断elif2&#xff09;例子3&#xff09;注意点 4.if嵌套…...

龙智汽车行业客户案例:Jira数据中心版助客户解锁高效项目管理

龙智技术支持部负责人、Atlassian认证专家叶燕秀分享了她帮助某汽车企业落地Jira的故事&#xff0c;并详解了该公司选择Jira数据中心版的理由以及工具链的集成情况&#xff0c;为有同样需求的公司提供实践参考。 本文由叶燕秀口述内容整理而成 需求管理&#xff1a;从Excel表格…...

03 vi编辑器

vi编辑器的三种模式: 不同的模式下机键动作解释的意义是不一样的 编辑模式 插入模式 末行模式 文件的打开和关闭保存 移动光标...

Web界面自动化操作工具 - Selenium常见用法

Selenium是一个用于自动化浏览器操作的工具&#xff0c;常用于Web应用程序的测试和爬虫开发。 下面是一些Python Selenium的常见用法和代码示例&#xff1a; 1. 导入Selenium库和WebDriver&#xff1a; from selenium import webdriver2. 创建WebDriver实例&#xff1a; # …...

Openssl数据安全传输平台009:加密理论基础:哈希/非对称加密RSA/对称加密AES

文章目录 0. 代码仓库代码编译时候可能出现的错误 1. 哈希1.1 哈希算法的种类:1.2 使用的头文件1.3 哈希算法API1.3.1 详解md5 API1.3.2 sha1/sha224/sha256/sha384/sha512常用API 1.5 sha1代码测试1.4 在VS中添加预处理器定义1.5 哈希算法C代码封装的思路 2. 非对称加密RSA2.1…...

iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案

爆句粗口&#xff0c;升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错&#xff0c;每次出错后都得重新开始下载&#xff0c;oh&#xff0c;f**k。上一次在在家里的网络升级成功。 解决办法一&#xff1a; 进入网址&#xff1a;https://developer.apple.com/download…...

Galaxy生信云平台|Maftools高效地汇总、分析、注释和可视化肿瘤基因突变MAF文件...

2023-10-25&#xff0c;Galaxy中国镜像站 UseGalaxy.cn 平台新增 5 个工具。 MAF Tools Maftools-突变景观图: 绘制肿瘤基因突变景观图Maftools-突变汇总: 汇总MAF文件中的突变信息Maftools-共突变与互斥突变: 计算共突变和互斥突变Maftools-队列比较&#xff1a;比较两个队列之…...

JS三种常见的存储机制

1.localStorage localStorage是HTML5引入的一种持久化存储机制&#xff0c;用于在浏览器中长期保存数据。localStorage中存储的数据没有过期时间&#xff0c;除非被显式清除或代码删除。存储在localStorage中的数据对于同一个域名下的所有页面都是共享的。localStorage可以存储…...

【Python机器学习】零基础掌握BaggingClassifier集成学习

何提高分类模型的稳定性和准确性? 在金融风控、医疗诊断或者社交媒体推荐等场景中,分类问题是常见的难题。但是,单一的分类模型(如SVM)在处理复杂或不均衡的数据集时可能会表现不佳。那么,有没有一种方法能够提高模型的稳定性和准确性呢? 假设一家银行想要通过机器学习…...

[晕事]今天做了件晕事26;gcc对strcmp/strncmp的优化

今天做了一件晕事,写了一个测试小程序,开头的程序例如下面片段。在后续又写了一些代码,进行编译,使用gdb查看可执行文件,怎么都得不到想要的结果,非常的纳闷,非常的奇怪。 int main() {char a[3]="ab";int b = strncmp(0, a, 1<...

【深度学习】使用Pytorch实现的用于时间序列预测的各种深度学习模型类

深度学习模型类 简介按滑动时间窗口切割数据集模型类CNNGRULSTMMLPRNNTCNTransformer 简介 本文所定义模型类的输入数据的形状shape统一为 [batch_size, time_step&#xff0c;n_features]&#xff0c;batch_size为批次大小&#xff0c;time_step为时间步长&#xff0c;n_feat…...

ts | js | 爬虫小公举分享

Curl转Code 快速将curl转为各种语言的代码; 便于提取请求头之类, 或者微改直接使用 https://curlconverter.com/node-axios/ (有点慢, 但是很全)https://www.lddgo.net/convert/curl-to-code (没有axios, 我喜欢用axios) 使用… 抓取地址, 使用浏览器或者其他抓包工具都可, 这…...

实现el-table打印功能,样式对齐,去除滚动条

实现el-table打印功能,样式对齐&#xff0c;去除滚动条 // 整个页面打印 function printTable(id) {// let domId #js_index// if (id) {// domId #${ id };// }// let wpt document.querySelector(domId);// let newContent wpt.innerHTML;// let oldContent document.…...

2022年09月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 表达式len(“学史明理增信 &#xff0c;读史终生受益”) > len(" reading history will benefit you ")的…...

【面试经典150 | 链表】两数相加

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…...

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...