若依框架集成WebSeockt方法

这篇具有很好参考价值的文章主要介绍了若依框架集成WebSeockt方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一步:在ruoyi-framework模块的pom.xml里添加websocket的jar包

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

第二步:在framework包下新建websocket包,添加一下4个文件

1、WebSocketConfig

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支持
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

2、WebSocketServer

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);

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public 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, "连接成功");
        }
    }

    /**
     * 连接关闭时处理
     */
    @OnClose
    public void onClose(Session session)
    {
        LOGGER.info("\n 关闭连接 - {}", session);
        // 移除用户
        WebSocketUsers.remove(session.getId());
        // 获取到信号量则需释放
        SemaphoreUtils.release(socketSemaphore);
    }

    /**
     * 抛出异常时处理
     */
    @OnError
    public 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);
    }

    /**
     * 服务器接收到客户端消息时调用的方法
     */
    @OnMessage
    public void onMessage(String message, Session session)
    {
        String msg = message.replace("你", "我").replace("吗", "");
        WebSocketUsers.sendMessageToUserByText(session, msg);
    }
}

3、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);
        }
    }
}

4、WebSocketUsers

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[你已离线]");
        }
    }
}

第三步:很关键,给websocket允许通过的权限,修改SecurityConfig文件的configure方法添加如下:

// websocket如果需要不登录也可以访问,需要在`SecurityConfig.java`中设置匿名访问
.antMatchers("/websocket/**").permitAll()

第四步:前端界面

<template>
  <div class="app-container home">
    <el-row :gutter="20">
      <el-col :sm="24" :lg="24">
        <h1>集成websocket测试</h1>
      </el-col>
    </el-row>
    <el-row :gutter="20">
      <el-col :sm="24" :lg="24">
        <div>
          <el-input v-model="url" type="text" style="width: 20%" /> &nbsp; &nbsp;
          <el-button @click="join" type="primary">连接</el-button>
          <el-button @click="exit" type="danger">断开</el-button>
          <br />
          <br />
          <el-input type="textarea" v-model="message" :rows="9" />
          <br />
          <br />
          <el-button type="info" @click="send">发送消息</el-button>
          <br />
          <br />
          <el-input type="textarea" v-model="text_content" :rows="9" /> 返回内容
          <br />
          <br />
        </div>
      </el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  name: "Index",
  data() {
    return {
      url: "ws://127.0.0.1:8080/websocket/message",
      message: "",
      text_content: "",
      ws: null,
    };
  },
  methods: {
    join() {
      const wsuri = this.url;
      this.ws = new WebSocket(wsuri);
      const self = this;
      this.ws.onopen = function (event) {
        self.text_content = self.text_content + "已经打开连接!" + "\n";
      };
      this.ws.onmessage = function (event) {
        self.text_content = event.data + "\n";
      };
      this.ws.onclose = function (event) {
        self.text_content = self.text_content + "已经关闭连接!" + "\n";
      };
    },
    exit() {
      if (this.ws) {
        this.ws.close();
        this.ws = null;
      }
    },
    send() {
      if (this.ws) {
        this.ws.send(this.message);
      } else {
        alert("未连接到服务器");
      }
    },
  },
};
</script>

第五步:启动服务,测试

若依框架集成WebSeockt方法

 文章来源地址https://www.toymoban.com/news/detail-421559.html

到了这里,关于若依框架集成WebSeockt方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 金字塔的思维--思考的第一步就是先提炼出一个基本框架

            如果以哲学的眼光来看待这一切,那么可以说每一件事情都包含在其他事物之间,包括我们的社会体系,包括整个自然界,万事万物都处于某一特定的体系当中。一辆行驶的汽车,一匹奔跑的骏马,一栋建筑,一个面包,你、我、他,所有的一切都从属于某一个大的

    2024年02月08日
    浏览(47)
  • ShardingSphere-JDBC-若依框架集成(SpringBoot)

    ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架(SpringBoot)前后端版本、动态数据源,可自行切换,默认数据源为达梦8 官网文档地址:https://shardingsphere.apache.org/document/current/cn/overview/ 简介 开源的分布式数据库中间件解决方案组成的生态圈 关系

    2024年02月12日
    浏览(37)
  • 若依vue前端 报错error:0308010C:digital envelope routines::unsupported一步到胃的解决方法

    大功告成, 然后 npm run dev自己试试吧. 参考帖子

    2024年02月05日
    浏览(55)
  • Python打开Windows可执行性程序的几种方法(Windows窗口自动化第一步)

    方法一:用Pywinauto第三包 方法二:使用os.system函数运行其他程序 方法三:win32api第三包使用ShellExecute函数运行其他程序 方法四:使用win32process.CreateProcess函数 方法七:用ctpyes模块调用C函数

    2024年02月16日
    浏览(59)
  • 使用若依框架和 EasyPoi 导出 Word 文档的方法详解

    若依框架是一个基于 Spring Boot 和 Vue 的快速开发平台,而 EasyPoi 是一个方便的 Java 导入导出工具库。本文将介绍如何在若依框架中使用 EasyPoi 导出 Word 文档,帮助你实现简单且高效的导出功能。 首先,我们需要在若依框架中添加 EasyPoi 的依赖。可以通过 Maven 或 Gradle 来管理依

    2024年02月13日
    浏览(128)
  • 若依框架后台管理系统-忘记后台管理密码-忘记密码重置方法

    1. 无盐老版 1.1、生成密码密文 1.2、替换数据库中密码 2. 加盐新版 (今天 2022-03-16) 2.1、生成密码密文 2.2、替换数据库中密码 补充说明 参考资料 管理后台忘记密码两步解决: 找到工具类: com.ruoyi.common.utils.SecurityUtils 添加 main 方法:打印出密码密文 大家好,我是笨笨,笨

    2024年02月15日
    浏览(43)
  • 若依框架(RuoYI)项目打包(jar)方法,部署到 Linux 服务器

    在若依框架的 bin 目录下,存在着三个 bat 文件,一个是清除之前的依赖的自动化 bat 脚本( clean.bat ),一个是自动化项目打包的 bat 脚本( package.bat ),一个是运行若依项目的脚本( run.bat ) 将ruoyi-admin 文件夹内的 pom.xml 文件内的 packaging 的值改成 jar 打包前,要清除之前的

    2024年02月12日
    浏览(68)
  • 关于 若依框架(前后端隔离版本) 图片映射问题的解决方法 (解决跨域问题,配置代理路由)

    开发代理: 在 vue 项目内的 vue.config.js 配置文件内配置 devserver 配置,在 proxy 参数内配置两个代理路径,如 生产代理: 在 nginx 配置文件 nginx.conf 内配置 图片代理路由,类似 /proc-api/ 一样的路由 参考如下链接,去配置后端图片映射路径 1. addResourceHandler配置静态资源映射本地

    2024年02月13日
    浏览(43)
  • 若依框架 - 短时间内断开连接,重复跳转至登录界面问题的解决方法(docker 与 redis)、令牌超时问题

    在很短的时间内不去操作系统,就会自动提示, 登录状态已过期,您可以继续留在该页面,或者重新登录 ,所以老是要跳转到登录界面,这一点很麻烦,非常影响用户体验。 令牌设置超时时间,过于短暂; redis 服务的启动配置文件有问题,没有配置密码登录,而是默认配置

    2024年02月13日
    浏览(34)
  • 学习matplotlib第一步

    下边代码会画出一个 y=cos(x) 的图像: 在Jupyter lab运行的时候,发现报错如下: conda install matplotlib -c https://mirrors.bfsu.edu.cn/anaconda/pkgs/main/ -n jupyterlabuse 从清华python源里边安装 matplotlib 。 完成之后显示: 运行结果如下图:

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包