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

Local AI MusicGen开箱即用:WebUI汉化+中文Prompt提示模板集成

Local AI MusicGen开箱即用&#xff1a;WebUI汉化中文Prompt提示模板集成 1. 引言 想不想拥有一个私人AI作曲家&#xff1f;不需要你懂五线谱&#xff0c;也不需要昂贵的编曲软件&#xff0c;只要输入几个词&#xff0c;比如“悲伤的小提琴”或者“赛博朋克电子乐”&#xff…...

终极指南:如何快速实现CocoaHTTPServer自定义连接处理

终极指南&#xff1a;如何快速实现CocoaHTTPServer自定义连接处理 【免费下载链接】CocoaHTTPServer A small, lightweight, embeddable HTTP server for Mac OS X or iOS applications 项目地址: https://gitcode.com/gh_mirrors/co/CocoaHTTPServer CocoaHTTPServer是…...

如何用TinyTroupe多智能体模拟优化大豆深加工工艺:提升效率的完整指南

如何用TinyTroupe多智能体模拟优化大豆深加工工艺&#xff1a;提升效率的完整指南 【免费下载链接】TinyTroupe LLM-powered multiagent persona simulation for imagination enhancement and business insights. 项目地址: https://gitcode.com/GitHub_Trending/ti/TinyTrou…...

QWEN-AUDIO效果分享:支持粤语拼音输入与粤语语音合成的扩展能力

QWEN-AUDIO效果分享&#xff1a;支持粤语拼音输入与粤语语音合成的扩展能力 1. 语音合成技术的新突破 QWEN-AUDIO智能语音合成系统基于通义千问Qwen3-Audio架构构建&#xff0c;这是一款真正具有"人类温度"的新一代语音合成系统。与传统TTS系统相比&#xff0c;它不…...

Wii Nunchuk嵌入式驱动库:I²C协议解析与跨平台适配

1. WiiChuck库概述&#xff1a;面向嵌入式系统的Wii Nunchuk通用适配框架WiiChuck是一个专为嵌入式平台设计的Wii Nunchuk&#xff08;任天堂Wiimote扩展手柄&#xff09;通用驱动库&#xff0c;其核心定位是提供跨平台、可裁剪、高可靠性的IC通信接口抽象层。该库并非简单封装…...

UniApp地图组件实战:5分钟搞定腾讯位置服务+自定义气泡弹窗(附避坑指南)

UniApp腾讯地图组件深度实战&#xff1a;从Key申请到自定义弹窗全流程解析 1. 腾讯位置服务Key申请与配置 在manifest.json中配置腾讯地图Key是第一步&#xff0c;但90%的开发者会忽略安全配置细节。正确的申请流程应该是&#xff1a; 访问腾讯位置服务官网&#xff0c;进入控制…...

探索基于Cruise与Simulink的前后双电机纯电动汽车联合仿真

基于Cruise和Simulink联合仿真前后双电机纯电动汽车模型&#xff0c;包含驱动转矩控制策略和最优转矩分配分配系数的dll文件&#xff0c;可根据自身车辆参数修改相关参数在电动汽车的研发领域&#xff0c;联合仿真技术正逐渐成为提升性能与优化设计的关键手段。今天咱就来唠唠基…...

用Python+OpenCV实现双目相机三维重建:从标定到triangulatePoints的完整流程

PythonOpenCV双目三维重建实战&#xff1a;从标定到点云生成的完整指南 当你第一次看到双目相机生成的彩色点云在屏幕上缓缓旋转时&#xff0c;那种震撼感难以言表。两个普通的USB摄像头&#xff0c;经过精确标定和算法处理&#xff0c;竟能重建出真实世界的三维结构。本文将带…...

OpenClaw定时任务详解:GLM-4.7-Flash每日自动生成工作报告

OpenClaw定时任务详解&#xff1a;GLM-4.7-Flash每日自动生成工作报告 1. 为什么需要自动化日报系统 上周三晚上11点&#xff0c;我盯着空白的周报文档发呆——明明这周完成了3个需求迭代和2次跨部门协作&#xff0c;却怎么都想不起具体细节。翻遍Git记录、邮件和会议纪要才勉…...

CM1数值模拟新手避坑指南:从namelist.input配置到并行计算实战

CM1数值模拟新手避坑指南&#xff1a;从namelist.input配置到并行计算实战 刚接触CM1模式的研究人员常常会在配置文件和并行计算环节踩坑——某个参数设置不当可能导致数小时的计算结果突然崩溃&#xff0c;或是并行效率低下浪费计算资源。本文将用真实案例拆解那些文档里没写…...