最近在找工作,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
版权归原作者 乾坤鸟 所有, 如有侵权,请联系我们删除。
版权归原作者 乾坤鸟 所有, 如有侵权,请联系我们删除。