0


SpringBoot 使用WebSocket详解

最近在找工作,Java前后端全站工程师一枚,有合适的请帮博主推荐一下
有项目的也可以联系我,感谢感谢
博主在北京 2023-07-04 发
V:y393016244

1、导入websocket包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.2.13.RELEASE</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.18.Final</version></dependency>

2、配置类

packagecom.ruoyi.websocket.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.socket.server.standard.ServerEndpointExporter;@ConfigurationpublicclassWebSocketConfig{/**
     * 会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
     * 要注意,如果使用独立的servlet容器,
     * 而不是直接使用springboot的内置容器,
     * 就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
     */@BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}

3、常量类

packagecom.ruoyi.websocket.constant;/**
 * 常量类
 */publicclassWsConstant{publicstaticfinalString CARDINFO="cardInfo";publicstaticfinalString IMGINFO="imgInfo";}

4、Websocket工具类,记录当前在线的链接对链接进行操作

packagecom.ruoyi.websocket.utils;importcom.alibaba.fastjson.JSON;importcom.ruoyi.common.core.domain.AjaxResult;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.util.StringUtils;importjavax.websocket.RemoteEndpoint;importjavax.websocket.Session;importjava.util.Collections;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;/**
 * Websocket工具类
 * 记录当前在线的链接对链接进行操作
 */publicclassWebsocketUtil{/**
     * 日志信息
     */privatestaticfinalLogger LOGGER =LoggerFactory.getLogger(WebsocketUtil.class);/**
     * 记录当前在线的Session
     */privatestaticfinalMap<String,Session> ONLINE_SESSION =newConcurrentHashMap<>();publicstaticfinalString sessionKey ="deviceId";/**
     * 添加session
     *
     * @param userId
     * @param session
     */publicstaticvoidaddSession(String userId,Session session){// 此处只允许一个用户的session链接。一个用户的多个连接,我们视为无效。
        ONLINE_SESSION.putIfAbsent(userId, session);}/**
     * 关闭session
     *
     * @param userId
     */publicstaticvoidremoveSession(String userId){
        ONLINE_SESSION.remove(userId);}/**
     * 给单个用户推送消息
     *
     * @param session
     * @param message
     */publicstaticvoidsendMessage(Session session,String message){if(session ==null){return;}// 同步RemoteEndpoint.Async async = session.getAsyncRemote();
        async.sendText(message);}/**
     * 向所有在线人发送消息
     *
     * @param message
     */publicstaticvoidsendMessageForAll(String message){//jdk8 新方法
        ONLINE_SESSION.forEach((sessionId, session)->{if(session.isOpen()){sendMessage(session, message);}});}/**
     * 根据用户ID发送消息
     *
     * @param result
     */publicstaticvoidsendMessage(String sessionId,AjaxResult result){sendMessage(sessionId, JSON.toJSONString(result));}/**
     * 根据用户ID发送消息
     *
     * @param message
     */publicstaticvoidsendMessage(String sessionId,String message){Session session = ONLINE_SESSION.get(sessionId);//判断是否存在该用户的session,判断是否还在线if(session ==null||!session.isOpen()){return;}sendMessage(session, message);}/**
     * 根据ID获取Session
     *
     * @param sessionId
     */publicstaticSessiongetSession(String sessionId){Session session = ONLINE_SESSION.get(sessionId);return session;}/**
     * 根据传过来的key获取session中的参数
     * @param key
     * @param session
     * @return
     */publicstaticStringgetParam(String key,Session session){Map map = session.getRequestParameterMap();Object userId1 = map.get(key);if(userId1 ==null){returnnull;}String s = userId1.toString();
        s = s.replaceAll("\\[","").replaceAll("]","");if(!StringUtils.isEmpty(s)){return s;}returnnull;}}
packagecom.ruoyi.common.core.domain;importjava.util.HashMap;importcom.ruoyi.common.utils.StringUtils;/**
 * 操作消息提醒
 *
 * @author ruoyi
 */publicclassAjaxResultextendsHashMap<String,Object>{privatestaticfinallong serialVersionUID =1L;/** 状态码 */publicstaticfinalString CODE_TAG ="code";/** 返回内容 */publicstaticfinalString MSG_TAG ="msg";/** 数据对象 */publicstaticfinalString DATA_TAG ="data";/**
     * 状态类型
     */publicenumType{/** 成功 */SUCCESS(0),/** 警告 */WARN(301),/** 错误 */ERROR(500);privatefinalint value;Type(int value){this.value = value;}publicintvalue(){returnthis.value;}}/**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */publicAjaxResult(){}/**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     */publicAjaxResult(Type type,String msg){super.put(CODE_TAG, type.value);super.put(MSG_TAG, msg);}/**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     * @param data 数据对象
     */publicAjaxResult(Type type,String msg,Object data){super.put(CODE_TAG, type.value);super.put(MSG_TAG, msg);if(StringUtils.isNotNull(data)){super.put(DATA_TAG, data);}}/**
     * 方便链式调用
     *
     * @param key 键
     * @param value 值
     * @return 数据对象
     */@OverridepublicAjaxResultput(String key,Object value){super.put(key, value);returnthis;}/**
     * 返回成功消息
     *
     * @return 成功消息
     */publicstaticAjaxResultsuccess(){returnAjaxResult.success("操作成功");}/**
     * 返回成功数据
     *
     * @return 成功消息
     */publicstaticAjaxResultsuccess(Object data){returnAjaxResult.success("操作成功", data);}/**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */publicstaticAjaxResultsuccess(String msg){returnAjaxResult.success(msg,null);}/**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */publicstaticAjaxResultsuccess(String msg,Object data){returnnewAjaxResult(Type.SUCCESS, msg, data);}/**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */publicstaticAjaxResultwarn(String msg){returnAjaxResult.warn(msg,null);}/**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */publicstaticAjaxResultwarn(String msg,Object data){returnnewAjaxResult(Type.WARN, msg, data);}/**
     * 返回错误消息
     *
     * @return
     */publicstaticAjaxResulterror(){returnAjaxResult.error("操作失败");}/**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */publicstaticAjaxResulterror(String msg){returnAjaxResult.error(msg,null);}/**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */publicstaticAjaxResulterror(String msg,Object data){returnnewAjaxResult(Type.ERROR, msg, data);}}

5、控制类

packagecom.ruoyi.websocket.wscontroller;importcom.ruoyi.common.core.domain.AjaxResult;importcom.ruoyi.netty.manager.DeviceChannelContext;importcom.ruoyi.websocket.utils.WebsocketUtil;importorg.springframework.stereotype.Component;importjavax.websocket.*;importjavax.websocket.server.ServerEndpoint;importjava.io.IOException;importjava.util.Map;@Component@ServerEndpoint(value ="/verifyDevice")publicclassFaceVerifyController{/**
     * 连接事件,加入注解
     *
     * @param session
     */@OnOpenpublicvoidonOpen(Session session){String deviceId =WebsocketUtil.getParam(WebsocketUtil.sessionKey, session);// 添加到session的映射关系中WebsocketUtil.addSession(deviceId, session);//测试发送消息WebsocketUtil.sendMessage(deviceId,AjaxResult.success("ok"));}/**
     * 连接事件,加入注解
     * 用户断开链接
     *
     * @param session
     */@OnClosepublicvoidonClose(Session session){String deviceId =WebsocketUtil.getParam(WebsocketUtil.sessionKey, session);// 删除映射关系WebsocketUtil.removeSession(deviceId);}/**
     * 当接收到用户上传的消息
     *
     * @param session
     */@OnMessagepublicvoidonMessage(Session session,String message){System.out.println(message);//        Map map = session.getRequestParameterMap();//        String userId = map.get(WebsocketUtil.sessionKey) == null ? null : map.get(WebsocketUtil.sessionKey).toString();}/**
     * 处理用户活连接异常
     *
     * @param session
     * @param throwable
     */@OnErrorpublicvoidonError(Session session,Throwable throwable){try{if(session.isOpen()){
                session.close();}}catch(IOException e){
            e.printStackTrace();}
        throwable.printStackTrace();}}

6、前端js页面

var url ="ws://"+ window.location.host +"/verifyDevice?deviceId="+ facedeviceCode;//建立webSocket连接
    websocket =newWebSocket(url);//打开webSokcet连接时,回调该函数
    websocket.onopen=()=> console.log("连接建立");//关闭webSocket连接时,回调该函数
    websocket.onclose=()=> console.log("连接关闭");//接收信息
    websocket.onmessage=function(res){var obj =eval('('+ res.data +')');//显示身份证信息和图片if(obj && obj.msg =="cardInfo"){
            console.info("调用discernToInfo方法");discernToInfo(obj);}//只显示图片elseif(obj && obj.msg =="imgInfo"){
            console.info("调用imgToInfo方法");imgToInfo(obj);}}

求关注~~~

点关注不迷路,喜欢的朋友们关注支持一下给点继续写的动力,感谢!!


本文转载自: https://blog.csdn.net/y393016244/article/details/127142864
版权归原作者 乾坤鸟 所有, 如有侵权,请联系我们删除。

“SpringBoot 使用WebSocket详解”的评论:

还没有评论