当前位置: 首页 > ai >正文

java+webstock

maven依赖

  <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId><artifactId>tomcat7-websocket</artifactId></dependency><dependency><groupId>javax.websocket</groupId><artifactId>websocket-api</artifactId></dependency>

配置类

public class WebSocketConfigurator extends Configurator {public ExecutorService getExecutorService(ServerEndpointConfig sec) {// 创建一个具有足够线程数的线程池return Executors.newFixedThreadPool(100);}public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {// 设置最大消息大小
//        response.setHeader("JSESSIONID", request.getSession().getId());
//        response.setHeader("Access-Control-Allow-Origin", "*");
//        response.setHeader("Access-Control-Allow-Credentials", "true");
//        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
//        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept, Origin");super.modifyHandshake(sec, request, response);}
}

跨域请求过滤

/**** 跨域请求过滤
* @ClassName: SecurityServlet
* @Description: TODO(这里用一句话描述这个类的作用)*/
public class SecurityServlet extends HttpServlet implements Filter {private static final long serialVersionUID = 1L;  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2) throws IOException, ServletException {  HttpServletResponse response=(HttpServletResponse) resp; response.setCharacterEncoding("UTF-8");response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "*");response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");response.setHeader("Access-Control-Expose-Headers", "*");arg2.doFilter(req, resp);return;     }public void init(FilterConfig arg0) throws ServletException {  }  }

系统初始化监听器

/*** 系统初始化监听器,在系统启动时运行,进行一些初始化工作**/
public class InitListener  implements javax.servlet.ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {}public void contextInitialized(ServletContextEvent event) {}}

websocket 消息服务类

@Component("LayIMServer")
@ServerEndpoint(value ="/websocket/{param}", configurator = WebSocketConfigurator.class)
@Scope("prototype")
public class LayIMServer {/*** 打开连接,每个客户端连接上以后都会调用此方法** @Description * @param session* @return void*/@OnOpenpublic <T> void open(Session session, @PathParam("param") String param) {//解析参数Map<String, Object> paramMap = getParamMap(param);String sourceApp = oConvertUtils.getString(paramMap.get("sourceApp"));String uid = oConvertUtils.getString(paramMap.get("uid"));//用户昵称String nickname = oConvertUtils.getString(paramMap.get("nickname"));if (!StringUtil.isNotEmpty(sourceApp)) {throw new RuntimeException("应用来源标识不能为空");}if (!StringUtil.isNotEmpty(uid)) {throw new RuntimeException("用户ID不能为空");}SocketUser user = new SocketUser();user.setSession(session);user.setUserId(uid);user.setSourceApp(sourceApp);user.setNickname(nickname);IUserManager iUserManager = LayIMFactory.createManager();System.out.println("0=" + DateUtils.getDate("yyyy-MM-dd HH:mm:ss"));iUserManager.addUser(user);LayIMLog.debug("当前在线用户:" + iUserManager.getOnlineCount());LayIMLog.debug("用户建立连接:" + uid);
//		// 发送消息MessageSender sender = new MessageSender();sender.sendUpdateVisualizationScreen(user);}/*** 接收消息** @Description * @param message* @param session* @param param* @return void*/@OnMessagepublic void onMessage(String message, Session session, @PathParam("param") String param) {System.out.println("onMessage--------"+message);}private Map<String, Object> getParamMap(String param) {Map<String, Object> paramMap = new HashMap<String, Object>();if (StringUtil.isNotEmpty(param)) {for (int a = 0; a < param.split("&").length; a++) {String param1[] = param.split("&")[a].split("=");paramMap.put(param1[0], "");if (param1.length == 2) {paramMap.put(param1[0], param1[1]);}}}return paramMap;}/*** 异常信息** @Description * @param t* @return void*/@OnErrorpublic void error(Throwable t) {t.printStackTrace();}/*** 关闭连接** @Description * @param session* @param param* @return void*/@OnClosepublic void close(Session session, @PathParam("param") String param) {//解析参数Map<String, Object> paramMap = getParamMap(param);String userId = oConvertUtils.getString(paramMap.get("uid"));IUserManager iUserManager = LayIMFactory.createManager();//获取用户信息SocketUser socketUser = iUserManager.getUser(userId);if(ObjectUtil.isNull(socketUser)){LayIMLog.debug("异常,用户未在线,不可执行离线操作");return;}LayIMLog.debug("用户离线:" + userId);// 移除该用户LayIMFactory.createManager().removeUser(socketUser);}

发送消息

/*** 发送信息类 所有从客户端到服务端的消息转发到此类进行消息处理 */
public class MessageSender {/** 发生消息* */public void sendUpdateVisualizationScreen(BladeUser user) {//获取在线用户IUserManager iUserManager = LayIMFactory.createManager();Map<String, SocketUser> sceneUser = iUserManager.getSocketUserMap();if(CollectionUtils.isEmpty(sceneUser)){return;}sceneUser.forEach((key, socketUser) -> {Session session = socketUser.getSession();try {if(session.isOpen()) {//给指定用户发生更新消息,获取内容发生给前端          Map<String,Object> visualStatisticsData = getData(user);sendText(socketUser,LayIMFactory.createSerializer().toJSON(visualStatisticsData));}} catch (Exception e) {e.printStackTrace();}});}
}
http://www.xdnf.cn/news/13058.html

相关文章:

  • 什么是API调用?通俗解释+实际应用场景详解
  • 【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
  • PAN/FPN
  • Flotherm许可的并发用户数限制
  • 【案例解析】一次 TIME_WAIT 导致 TPS 断崖式下降的排查与优化
  • ThreadLocal 源码
  • RabbitMq安装
  • deepseek: GPU 配套
  • 联邦学习同态加密以及常见问题
  • Vue动态/异步组件
  • 1991-2024年上市公司个股换手率数据
  • Haption 力反馈遥操作机器人:6 自由度 + 低延迟响应,解锁精准远程操控体验
  • 设置Outlook关闭时最小化
  • mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
  • JDK 17 序列化是怎么回事
  • Prompt‏ 工程和优化技巧
  • 产品经理课程(十三)
  • SE(Secure Element)加密芯片与MCU协同工作的典型流程
  • 在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
  • Origin图像数字化工具——如何复制其他人的图表作为对比数据
  • Linux 下部署安装docker
  • 京东商品sku抓取攻略|已封装API接口调用示例
  • SpringBoot配置
  • 【如何做好技术架构】
  • 大模型真的像人一样“思考”和“理解”吗?​
  • Python编程基础(五) | 字典
  • 深度伪造视频时代的“火眼金睛”:用Python打造假视频识别神器
  • 循环语句之for
  • Latex vscode安装、配置与使用-Windows
  • 文件上传漏洞防御全攻略