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
参考:Java中的MINA框架_java mina_小陈拾光的博客-CSDN博客 MINA:一个简洁易用的基于TCP/IP通信的JAVA框架。 <dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.1.5&…...
Linux基础:2:shell外壳+文件权限
shell外壳文件权限 一.shell原理:1.对比:windo GUI 和 shell1.windo GUI2. shell 2.为什么?是什么?怎么办?1.为什么有shell2.是什么?3.怎么办?4.补充: 二.linux权限管理:…...
webpack 解决:TypeError: merge is not a function 的问题
1、问题描述: 其一、存在的问题为: TypeError: merge is not a function 中文为: 类型错误:merge 不是函数 其二、问题描述为: 想执行 npm run dev 命令,运行起项目时,控制台报错 TypeErro…...
datahub 中血缘图的实现分析,在react中使用airbnb的visx可视化库来画有向无环图
背景 做大数据的项目,必不可少的是要接触到数据血缘图,它在大数据项目中有着很重要的作用。 之前在公司也做过一些案例,也看过很多友商的产品,阿里的DataWork,领英的Datahub, datawork的血缘图使用的是 G6…...
二、判断语句
文章目录 1.if语句1)if判断语句基本格式2) 网吧上网3)if语句使用逻辑运算 2.if-else语句1)if-else的使用格式2)网吧上网 3.多重判断elif语句1) 多重判断elif2)例子3)注意点 4.if嵌套…...
龙智汽车行业客户案例:Jira数据中心版助客户解锁高效项目管理
龙智技术支持部负责人、Atlassian认证专家叶燕秀分享了她帮助某汽车企业落地Jira的故事,并详解了该公司选择Jira数据中心版的理由以及工具链的集成情况,为有同样需求的公司提供实践参考。 本文由叶燕秀口述内容整理而成 需求管理:从Excel表格…...
03 vi编辑器
vi编辑器的三种模式: 不同的模式下机键动作解释的意义是不一样的 编辑模式 插入模式 末行模式 文件的打开和关闭保存 移动光标...
Web界面自动化操作工具 - Selenium常见用法
Selenium是一个用于自动化浏览器操作的工具,常用于Web应用程序的测试和爬虫开发。 下面是一些Python Selenium的常见用法和代码示例: 1. 导入Selenium库和WebDriver: from selenium import webdriver2. 创建WebDriver实例: # …...
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失败解决方案
爆句粗口,升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错,每次出错后都得重新开始下载,oh,f**k。上一次在在家里的网络升级成功。 解决办法一: 进入网址:https://developer.apple.com/download…...
Galaxy生信云平台|Maftools高效地汇总、分析、注释和可视化肿瘤基因突变MAF文件...
2023-10-25,Galaxy中国镜像站 UseGalaxy.cn 平台新增 5 个工具。 MAF Tools Maftools-突变景观图: 绘制肿瘤基因突变景观图Maftools-突变汇总: 汇总MAF文件中的突变信息Maftools-共突变与互斥突变: 计算共突变和互斥突变Maftools-队列比较:比较两个队列之…...
JS三种常见的存储机制
1.localStorage localStorage是HTML5引入的一种持久化存储机制,用于在浏览器中长期保存数据。localStorage中存储的数据没有过期时间,除非被显式清除或代码删除。存储在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,n_features],batch_size为批次大小,time_step为时间步长,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打印功能,样式对齐,去除滚动条 // 整个页面打印 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等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 表达式len(“学史明理增信 ,读史终生受益”) > len(" reading history will benefit you ")的…...
【面试经典150 | 链表】两数相加
文章目录 写在前面Tag题目来源题目解读解题思路方法一:模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到…...
vue路径中“@/“代表什么
举例: <img src"/../static/imgNew/adv/tupian.jpg"/>其中,/是webpack设置的路径别名,代表什么路径,要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置: 上图中代表src,上述代码就…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
