文章目录

  • 若依集成websocket实现实时通信
    • 1、`ruoyi-framework/pom.xml`文件添加`websocket`依赖。
    • 2、配置匿名访问
      • - shiro安全框架
      • - springScecurity
    • 3、将以下代码创建到对应位置,每一个代码块的第一行是对应的位置,这里仅仅只写出ruiyi分离版的,首先在framwork模块framwork包中创建websocker包然后分别创建对应的class文件,并且将下方代码复制进去
    • 4、测试验证

若依集成websocket实现实时通信

需要按照具体情况进行操作对于某些时候可能有相对改动

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

1、ruoyi-framework/pom.xml文件添加websocket依赖。

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

2、配置匿名访问

- shiro安全框架

// 如果需要不登录也可以访问,需要设置匿名访问
filterChainDefinitionMap.put("/websocket/**", "anon");

- springScecurity

//位置 class com.aries.framework.config.SecurityConfig;//忽略websocket拦截@Overridepublic void configure(WebSecurity webSecurity) {webSecurity.ignoring().antMatchers("/websocket/**");}

3、将以下代码创建到对应位置,每一个代码块的第一行是对应的位置,这里仅仅只写出ruiyi分离版的,首先在framwork模块framwork包中创建websocker包然后分别创建对应的class文件,并且将下方代码复制进去

SemaphoreUtils : 信号量相关处理

package com.ruoyi.framework.websocket;import java.util.concurrent.Semaphore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 信号量相关处理* * @author ruoyi*/
public class SemaphoreUtils
{/*** SemaphoreUtils 日志控制器*/private static final Logger LOGGER = LoggerFactory.getLogger(SemaphoreUtils.class);/*** 获取信号量* * @param semaphore* @return*/public static boolean tryAcquire(Semaphore semaphore){boolean flag = false;try{flag = semaphore.tryAcquire();}catch (Exception e){LOGGER.error("获取信号量异常", e);}return flag;}/*** 释放信号量* * @param semaphore*/public static void release(Semaphore semaphore){try{semaphore.release();}catch (Exception e){LOGGER.error("释放信号量异常", e);}}
}

WebSocketConfig : websocket 配置

package com.ruoyi.framework.websocket;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** websocket 配置* * @author ruoyi*/
@Configuration
public class WebSocketConfig
{@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

WebSocketServer : websocket 消息处理

package com.ruoyi.framework.websocket;import java.util.concurrent.Semaphore;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** websocket 消息处理* * @author ruoyi*/
@Component
@ServerEndpoint("/websocket/message")
public class WebSocketServer
{/*** WebSocketServer 日志控制器*/private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);/*** 默认最多允许同时在线人数100*/public static int socketMaxOnlineCount = 100;private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session) throws Exception{boolean semaphoreFlag = false;// 尝试获取信号量semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore);if (!semaphoreFlag){// 未获取到信号量LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount);WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount);session.close();}else{// 添加用户WebSocketUsers.put(session.getId(), session);LOGGER.info("\n 建立连接 - {}", session);LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size());WebSocketUsers.sendMessageToUserByText(session, "连接成功");}}/*** 连接关闭时处理*/@OnClosepublic void onClose(Session session){LOGGER.info("\n 关闭连接 - {}", session);// 移除用户WebSocketUsers.remove(session.getId());// 获取到信号量则需释放SemaphoreUtils.release(socketSemaphore);}/*** 抛出异常时处理*/@OnErrorpublic void onError(Session session, Throwable exception) throws Exception{if (session.isOpen()){// 关闭连接session.close();}String sessionId = session.getId();LOGGER.info("\n 连接异常 - {}", sessionId);LOGGER.info("\n 异常信息 - {}", exception);// 移出用户WebSocketUsers.remove(sessionId);// 获取到信号量则需释放SemaphoreUtils.release(socketSemaphore);}/*** 服务器接收到客户端消息时调用的方法*/@OnMessagepublic void onMessage(String message, Session session){String msg = message.replace("你", "我").replace("吗", "");WebSocketUsers.sendMessageToUserByText(session, msg);}
}

WebSocketUsers : websocket 客户端用户集

package com.ruoyi.framework.websocket;import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** websocket 客户端用户集* * @author ruoyi*/
public class WebSocketUsers
{/*** WebSocketUsers 日志控制器*/private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class);/*** 用户集*/private static Map<String, Session> USERS = new ConcurrentHashMap<String, Session>();/*** 存储用户** @param key 唯一键* @param session 用户信息*/public static void put(String key, Session session){USERS.put(key, session);}/*** 移除用户** @param session 用户信息** @return 移除结果*/public static boolean remove(Session session){String key = null;boolean flag = USERS.containsValue(session);if (flag){Set<Map.Entry<String, Session>> entries = USERS.entrySet();for (Map.Entry<String, Session> entry : entries){Session value = entry.getValue();if (value.equals(session)){key = entry.getKey();break;}}}else{return true;}return remove(key);}/*** 移出用户** @param key 键*/public static boolean remove(String key){LOGGER.info("\n 正在移出用户 - {}", key);Session remove = USERS.remove(key);if (remove != null){boolean containsValue = USERS.containsValue(remove);LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功");return containsValue;}else{return true;}}/*** 获取在线用户列表** @return 返回用户集合*/public static Map<String, Session> getUsers(){return USERS;}/*** 群发消息文本消息** @param message 消息内容*/public static void sendMessageToUsersByText(String message){Collection<Session> values = USERS.values();for (Session value : values){sendMessageToUserByText(value, message);}}/*** 发送文本消息** @param userName 自己的用户名* @param message 消息内容*/public static void sendMessageToUserByText(Session session, String message){if (session != null){try{session.getBasicRemote().sendText(message);}catch (IOException e){LOGGER.error("\n[发送消息异常]", e);}}else{LOGGER.info("\n[你已离线]");}}
}

4、测试验证

如果要测试验证可以把websocket.html内容复制到login.html,点击连接发送消息测试返回结果。

websocket.html代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>测试界面</title><script src="https://code.jquery.com/jquery-3.2.1.min.js" ></script>
</head><body><div><input type="text" style="width: 20%" value="ws://127.0.0.1:80/websocket/message" id="url"><button id="btn_join">连接</button><button id="btn_exit">断开</button>
</div>
<br/>
<textarea id="message" cols="100" rows="9"></textarea> <button id="btn_send">发送消息</button>
<br/>
<br/>
<textarea id="text_content" readonly="readonly" cols="100" rows="9"></textarea>返回内容
<br/>
<br/><script type="text/javascript">$(document).ready(function(){var ws = null;// 连接$('#btn_join').click(function() {var url = $("#url").val();ws = new WebSocket(url);ws.onopen = function(event) {$('#text_content').append('已经打开连接!' + '\n');}ws.onmessage = function(event) {$('#text_content').append(event.data + '\n');}ws.onclose = function(event) {$('#text_content').append('已经关闭连接!' + '\n');}});// 发送消息$('#btn_send').click(function() {var message = $('#message').val();if (ws) {ws.send(message);} else {alert("未连接到服务器");}});//断开$('#btn_exit').click(function() {if (ws) {ws.close();ws = null;}});})</script>
</body>
</html>

若依(ruoyi/ruoyi-vue)集成websocket以及ws配置匿名访问相关推荐

  1. 若依前后端分离框架集成websocket

    1. 若依不分离框架集成websocket可以参照http://doc.ruoyi.vip/ruoyi/document/cjjc.html#%E9%9B%86%E6%88%90websocket%E ...

  2. Ruoyi框架中在提示认证失败,无法访问系统资源

    解决办法: 方法1:在 SecurityConfig 中设置httpSecurity 配置匿名访问 / 使用 permitAll() 方法所有人都能访问,包括带上 token 访问 .antMatch ...

  3. SpringBoot+Vue整合WebSocket实现前后端消息推送

    场景 WebSocket HTTP 协议是一种无状态的.无连接的.单向的应用层协议.它采用了请求/响应模型.通信请求只能由客户端发起,服务端对请求做出应答处理. 这种通信模型有一个弊端:HTTP 协议 ...

  4. 【RuoYi-Vue-Plus】扩展笔记 02 - 集成 WebSocket 发送消息到客户端(源码)

    文章目录 前言 关于需求实现的对比(轮询与 `WebSocket` ) 关于本篇文章 参考目录 代码实现参考 原理分析参考 集成流程 1.Maven 2.WebSocket 配置类 `WebSocke ...

  5. SpringBoot集成WebSocket实现及时通讯聊天功能!!!

    1:在SpringBoot的pom.xml文件里添加依赖: <!-- websocket --> <dependency><groupId>org.springfr ...

  6. SpringBoot 集成 webSocket,实现后台向客户端推送消息

    图文等内容参考链接 SpringBoot2.0集成WebSocket,实现后台向前端推送信息_Moshow郑锴的博客-CSDN博客_springboot websocket WebSocket 简介 ...

  7. socket接收的消息怎么更新到页面_spring boot 集成 websocket 实现消息主动

    前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...

  8. html5 长链接,Vue通过WebSocket建立长连接,连接

    Vue通过WebSocket建立长连接,连接 使用场景: 在项目开发中,后端需要处理一连串的逻辑,或者等待第三方的数据返回来进行处理之后在返回给前端,可能时间会很长,而且前端也不知道后端什么时候能处理 ...

  9. springboot websocket_SpringBoot 集成 WebSocket 实现前后端消息互传

    WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信-允许服务器主动发送信息给客户端. 为什么需要WebSocket? 大家都知道 ...

最新文章

  1. git用.gitignore忽略指定文件
  2. elastic-job的原理简介和使用
  3. php cms使用视频教程,PHPCMS v9视频模块使用教程二
  4. mybatis返回null_面试官:你分析过mybatis工作原理吗?
  5. 计算机 运行命令,教你电脑运行命令
  6. 视频编解码,bbv 缓冲区的上溢和下溢
  7. 机器学习算法中的准确率、精确率、召回率和F值
  8. Windowsx64位安装pymssql并完成与数据库链接
  9. python切片操作 当所有数据都省略时_python疑难问题---13、Python切片操作
  10. “先加密后签名”是不是安全?看完这篇就秒懂!
  11. S3C DMA使用方法,2410-2440 dma介绍
  12. kotlin之高阶函数
  13. RPA应用场景-自动轮询汇总报表
  14. 黑塞矩阵(海森矩阵,Hessian Matrix)与牛顿法最优化
  15. 系统分析师考试大纲2009
  16. ubuntu 恢复被删除的文件
  17. SAP SD 销售订单收入和成本对应科目的逻辑
  18. 威联通TS231nas虚拟服务器,威联通NAS小技巧:自带VS3软件下安装win7虚拟机
  19. 【C++】Boost库简介
  20. 01区块链研究的最新进展理论、建模和工具

热门文章

  1. Metronic前端模板
  2. 国民技术N32G032 PWM+DMA 8路输出
  3. dovecot+mysql 和空壳邮件
  4. Linux 内核参数说明
  5. 1266 蚂蚁(思维题)
  6. 网络安全合规-Tisax(汽车安全评估讯息交换平台)一
  7. 如何高速下载百度云资源
  8. html5+山东地区图片,html5 canvas山东省地图分布颜色标记
  9. paddle踩坑 RuntimeError: (NotFound) Output(Scale@GRAD) and Output(Bias@GRAD) mu
  10. 百度网站权重(SEO)查询