Autoxjs 实践-Spring Boot 集成 WebSocket

概述

最近弄了福袋工具,由于工具运行中,不好查看福袋结果,所以我想将福袋工具运行数据返回到后台,做数据统计、之后工具会越来越多,就弄了个后台,方便管理。

实现效果

在这里插入图片描述

在这里插入图片描述

WebSocket?

websocket是一种在单个TCP连接上进行全双工通讯的协议,websocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,在websocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

简单来说:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

Autoxjs + Springboot + Websocket通用版

集成分为三步:添加依赖、增加配置类和消息核心类、Autoxjs集成。

maven 添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket配置类

@Configuration
public class WebSocketConfig{@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

消息核心类WebSocketServer

@ServerEndpoint("/websocket/{adminId}")
@Component
public class WebSocketMessage{/** 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 */private static int onlineCount = 0;/** concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 */private static CopyOnWriteArraySet<WebSocketMessage> webSocketSet = new CopyOnWriteArraySet<WebSocketMessage>();/** 与某个客户端的连接会话,需要通过它来给客户端发送数据 */private Session session;protected static final Logger logger = LoggerFactory.getLogger(WebSocketMessage.class);/** 用户ID*/private String adminId;/*** 连接建立成功调用的方法* @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据*/@OnOpenpublic void onOpen(Session session, @PathParam("adminId") String adminId) throws IOException{//重复标识//boolean isFlay = true;for(WebSocketMessage item: webSocketSet){if(adminId.equals(item.adminId)){item.onClose();//isFlay = false;//break;}}this.session = session;this.adminId = adminId;webSocketSet.add(this);     //加入set中addOnlineCount();           //在线数加1logger.info("有新连接加入!当前在线人数为" + getOnlineCount() + "用户id:"+adminId);}/*** 连接关闭调用的方法*/@OnClosepublic void onClose(){webSocketSet.remove(this);  //从set中删除subOnlineCount();           //在线数减1    logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());}/*** 收到客户端消息后调用的方法* @param message 客户端发送过来的消息* @param session 可选的参数*/@OnMessagepublic void onMessage(String message, Session session) {logger.info("来自客户端的消息:" + message);}/*** 发生错误时调用* @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error){logger.info("发生错误:"+error.getMessage());error.printStackTrace();}/*** 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。* @param message* @throws IOException*/public void sendMessage(String message) throws IOException{this.session.getBasicRemote().sendText(message);//this.session.getAsyncRemote().sendText(message);}/*** * @Description 获取在线人数* @Date 2019年8月6日 下午2:29:37* @Author Jly* @return*/public static synchronized int getOnlineCount() {return onlineCount;}/*** * @Description 添加在线人数* @Date 2019年8月6日 下午2:30:01* @Author Jly*/public static synchronized void addOnlineCount() {WebSocketMessage.onlineCount++;}/*** * @Description 减少在线人数* @Date 2019年8月6日 下午2:30:18* @Author Jly*/public static synchronized void subOnlineCount() {WebSocketMessage.onlineCount--;}/*** 测试页面接受信息* @param adminId* @param message*/public static void sendDataMessage(String adminId, String message){//群发消息for(WebSocketMessage item: webSocketSet){             try {if(adminId.equals(item.adminId)){item.sendMessage(message);}} catch (IOException e) {e.printStackTrace();continue;}}}
}

autoxJs webSocket

importPackage(Packages["okhttp3"]); //导入包
var globalWebsocket = null;
var client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();
// 需要根据自己改IP
var request = new 
Request.Builder().url("ws://192.168.0.91:8080/websocket/349075715535306752").build(); //vscode  插件的ip地址,
client.dispatcher().cancelAll();//清理一次
myListener = {onOpen: function (result, response) {console.log("连接成功");globalWebsocket = result},onMessage: function (webSocket, msg) { //msg可能是字符串,也可能是byte数组,取决于服务器送的内容print("msg");print(msg);},onClosing: function (webSocket, code, response) {print("正在关闭");},onClosed: function (webSocket, code, response) {print("已关闭");},onFailure: function (webSocket, t, response) {print("错误");}
}
function init() {webSocket = client.newWebSocket(request, new WebSocketListener(myListener)); //创建链接
}
function run() {try {if (globalWebsocket == null) {init();sleep(500)} else {var json = {};json.command = "PING"let success = globalWebsocket.send(JSON.stringify(json))if (!success) {console.log("发送失败")}sleep(1000)}} catch (e) {console.log(e)}
}
//发送心跳
threads.start(function () {setInterval(() => {run()}, 30 * 1000);
})

总结

资源仅为学习参考!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/678781.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理之SVD检测显示屏缺陷(C++)

图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09; 文章目录 图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09;前言一、SVD算法简介二、代码实现总结 前言 显示屏缺陷检测是机器视觉领域的一处较广泛的应用场景&#xff0c;显示屏主要有LCD和OLED&#xff0c;缺陷类…

本地连接服务器Jupyter【简略版】

首先需要在你的服务器激活conda虚拟环境&#xff1a; 进入虚拟环境后使用conda install jupyter命令安装jupyter&#xff1a; 安装成功后先不要着急打开&#xff0c;因为需要设置密码&#xff0c;使用jupyter notebook password命令输入自己进入jupyter的密码&#xff1a; …

USB系列一:USB技术概念

在这里USB的历史就不赘述了&#xff0c;有兴趣可以自己去搜索。也省略掉USB接口的概述&#xff0c;这些都是一些飞技术性的常识性的知识&#xff0c;没必要浪费篇幅和文字来描述。 一、USB总线版本&#xff1a;&#xff08;从USB1.1说起&#xff09; 1、USB1.1 1998年9月23日…

怎么获取二维码链接?二维码图片链接提取技巧

现在很多内容会使用二维码的方式来做展示&#xff0c;这种方式可以实现内容的快速传递&#xff0c;而且当遇到无法扫码的情况时&#xff0c;也可以通过二维码链接来访问内容&#xff0c;与其他内容分享方式相比更加灵活。那么如何快速提取二维码链接呢&#xff1f;可能有很多小…

0508_IO3

练习1&#xff1a; 1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 1 #include <stdio.h…

鸿蒙开发接口Ability框架:【 (ServiceExtensionAbility)】

ServiceExtensionAbility ServiceExtensionAbility模块提供ServiceExtension服务扩展相关接口的能力。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 导入…

Kafka和Spark Streaming的组合使用(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.11-2.3.1.tgz -C /usr/local cd /usr/local sudo mv kafka_2.11-2.3.1 kafka-2.3.1 sudo chown -R qiangzi ./kafka-2.3.1 二、启动Kafaka 1.首先需要启动K…

Qt应用开发(拓展篇)——图表 QChart

一、前言 QChart是一个图形库模块&#xff0c;它可以实现不同类型的序列和其他图表相关对象(如图例和轴)的图形表示。要在布局中简单地显示图表&#xff0c;可以使用QChartView来代替QChart。此外&#xff0c;线条、样条、面积和散点序列可以通过使用QPolarChart类表示为极坐标…

给window电脑安装Linux系统

身为小白的我们在安装Linux系统时会遇到很多麻烦&#xff0c;没有接触过的命令&#xff0c;没有实际操作的经验&#xff0c;觉得Linux遥不可及&#xff0c;这篇博客讲述了我安装Linux的经历与安装过程遇到的问题与解决方案。我是为了学习Linux开发而安装&#xff0c;目的不同安…

重置密码之后无法ssh登录

背景描述 我这边有个服务器S&#xff0c;我从ServerA可以ssh上去&#xff0c;但是我从堡垒机B无法ssh上去&#xff1b;一开始以为是密码问题&#xff0c;手动重置密码&#xff0c;但是依然无法登录进去&#xff1b;一直提示密码错误&#xff1b;改了好几次密码都不行 问题原因…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

HTTP常见面试题(二)

3.1 HTTP 常见面试题 HTTP特性 HTTP 常见到版本有 HTTP/1.1&#xff0c;HTTP/2.0&#xff0c;HTTP/3.0&#xff0c;不同版本的 HTTP 特性是不一样的。 HTTP/1.1 的优点有哪些&#xff1f; HTTP 最突出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。 1. 简单 HTTP…