当前位置: 首页 > 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,上述代码就…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...