SpringBoot集成websocket(java注解方式)
第一种:SpringBoot官网提供了一种websocket的集成方式
第二种:javax.websocket中提供了元注解的方式
下面讲解简单的第二种
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 打包成war包这个一定要设置为provided,不然websocket连不上 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置类
WebSocketConfig.java
package com.meeno.trainsys.websocket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @description: WebSocketConfig类
* @author: Wzq
* @create: 2020-04-15 11:22
*/
//当我们使用外部Tomcat时,项目的管理权将会由Spring交接至Tomcat。
// 而Tomcat7及后续版本是对websocket直接支持的,且我们所使用的jar包也是tomcat提供的。
// 但是我们在WebSocketConfig中将ServerEndpointExporter指定给Spring管理。
// 而部署后ServerEndpoint是需要Tomcat直接管理才能生效的。
// 所以此时即就是此包的管理权交接失败,那肯定不能成功了。
// 最后我们需要将WebSocketConfig中的bean配置注释掉
@Configuration
public class WebSocketConfig {
// 本地开发打开注释,打包成war注释掉再打包
// @Bean
// public ServerEndpointExporter serverEndpointExporter() {
// return new ServerEndpointExporter();
// }
}
MeetingWebSocket.java
package com.meeno.trainsys.websocket.controller;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.meeno.framework.constants.Constants;
import com.meeno.framework.util.JsonUtils;
import com.meeno.trainsys.user.service.UserMessageService;
import com.meeno.trainsys.user.view.MeetingEmployeeChatListView;
import com.meeno.trainsys.user.view.UserMessageListView;
import com.meeno.trainsys.websocket.constants.SocketConstants;
import com.meeno.trainsys.websocket.model.MeetingSocketModel;
import com.meeno.trainsys.websocket.view.MeetingSocketView;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @description:
* @author: Wzq
* @create: 2020-04-15 11:30
*/
@Component
@ServerEndpoint("/websocket/{meetingId}/{empId}")
@Log
public class MeetingWebSocket {
private static UserMessageService userMessageService;
@Autowired
public void setUserMessageService(UserMessageService userMessageService){
MeetingWebSocket.userMessageService = userMessageService;
}
// concurrent包的线程安全Map,用来存放每个客户端对应的MyWebSocket对象。 Long为会议室id
private static ConcurrentHashMap<String,MeetingWebSocket> webSocketMap = new ConcurrentHashMap<String,MeetingWebSocket>();
//会议id
private Long meetingId;
//当前用户id
private Long userId;
// 当前聊天对象Session
private Session session;
// 未读数量
private Integer notReadNum;
/**
* 连接建立成功调用的方法*/
@OnOpen
public void onOpen(Session session, @PathParam("meetingId") Long meetingId,@PathParam("empId") Long empId) {
log.info("onOpen->meetingId:" + meetingId);
//创建一个会议webSocket
this.session = session;
this.meetingId = meetingId;
this.userId = empId;
webSocketMap.put(meetingId + "-" + userId,this);
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
log.info("onClose!");
//那个关闭了连接清空map
if(this.meetingId != null && this.userId != null){
String keyStr = this.meetingId + "-" + this.userId;
webSocketMap.remove(keyStr);
}
}
/**
* 收到客户端消息后调用的方法
* @param message
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam("meetingId") Long meetingId,@PathParam("empId") Long empId){
log.info("onMessage!" + message);
//发送消息给指定的人
this.sendMessageByUserId(1,model.getMeetingId(),model.getTargetEmpId());
}
/**
* 发生错误时调用
*/
@OnError
public void onError(Session session, Throwable error){
log.info("webSocket发生错误!");
error.printStackTrace();
}
/**
* 根据会议id和用户id获取Socket
* @param meetingId
* @param userId
*/
public static MeetingWebSocket getSocketByMeetingAndUserId(Long meetingId,Long userId){
for (String keyStr : webSocketMap.keySet()) {
String[] splitStr = keyStr.split("-");
String keyMeetingIdStr = splitStr[0];
if(meetingId.toString().equals(keyMeetingIdStr)){
if(webSocketMap.get(keyStr).userId.equals(userId)){
MeetingWebSocket meetingWebSocket = webSocketMap.get(keyStr);
return meetingWebSocket;
}
}
}
return null;
}
/**
* 根据会议和用户id发送消息
* @param msg
* @param meetingId
* @param userId
*/
private void sendMessageByUserId(String msg,Long meetingId,Long userId){
for (String keyStr : webSocketMap.keySet()) {
String[] splitStr = keyStr.split("-");
String keyMeetingIdStr = splitStr[0];
if(meetingId.toString().equals(keyMeetingIdStr)){
if(webSocketMap.get(keyStr).userId.equals(userId)){
MeetingWebSocket meetingWebSocket = webSocketMap.get(keyStr);
meetingWebSocket.sendMessage(msg);
}
}
}
}
/**
* 发送消息
* @param msg
*/
private void sendMessage(String msg){
try {
this.session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试连接
SpringBoot集成websocket(java注解方式)的更多相关文章
- springboot集成websocket的两种实现方式
WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能 ...
- springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- springboot集成websocket实现大文件分块上传
遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...
- SpringBoot集成websocket发送后台日志到前台页面
业务需求 后台为一个采集系统,需要将采集过程中产生的日志实时发送到前台页面展示,以便了解采集过程. 技能点 SpringBoot 2.x websocket logback thymeleaf Rab ...
- SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送
代码全部复制,仅供自己学习用 1.环境搭建 因为在上一篇基于STOMP协议实现的WebSocket里已经有大概介绍过Web的基本情况了,所以在这篇就不多说了,我们直接进入正题吧,在SpringBoot ...
- spring的Java注解方式
以往我们在使用spring的时候都是用一堆<>这个玩意(尖括号)的xml文件来配置spring,在xml里都是"xxx"来配置需要的内容信息,在"" ...
- SpringBoot集成websocket(Spring方式)
SpringWebSocketConfig配置 package com.meeno.chemical.socket.task.config; import com.meeno.chemical.soc ...
- Springboot集成WebSocket通信全部代码,即扣即用。
websocket通信主要来自两个类以及一个测试的html页面. MyHandler 和 WebSocketH5Config,下面全部代码 MyHandler类全部代码: package com.un ...
随机推荐
- 【Python从入门到精通】(十)Python流程控制的关键字该怎么用呢?【收藏下来,常看常新】
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 这篇文章主要介绍Python中流程控制的关键字的使用,涉及到if else,for,while等关键字 干货满满,建议收藏,需要用到时常看看. 小 ...
- 前端-js基础
HTML三把利剑之一,浏览器具有解析js的能力 一.js基础 在HTML中可以将JavaScript/JS的代码写在head中,被script标签所包裹,当浏览器解释HTML时,遇到style标签时, ...
- 『与善仁』Appium基础 — 2、常用Android模拟器的安装
目录 1.Android Virtual Devices模拟器 2.Genymotion模拟器 (1)Genymotion模拟器下载 (2)模拟器Genymotion安装 (3)Genymotion模 ...
- C语言:c++ ++c
#include <stdio.h> int main() {int a=3,x; x=(a++)+(++a)+(++a); printf("%d",x); getch ...
- [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查
此文章也是关注网上好几篇技术文章后,今天分享出来.因为,总有在程序学习路上的小伙伴会感到迷茫.而迷茫存在的情况如下 第一种:在大学学习中出现的迷茫,不知道Java到底要学什么.学习Java的标准是什么 ...
- web系统国际化思路
需求:php开发多个中文系统支持国际化 思路: 提炼各个系统中的中文字符,替换为资源key. 多媒体文件中的中文定位(图片中的中文,中文录音,中文视频,中文模板等). 统一翻译文字.准备资源文件. 各 ...
- 【学习笔记】Tensor多维数组和axis的理解
Tensor多维数组和axis的理解 今天在编写程序的时候一直对于axis=0或等于1搞不明白,这样对于整个numpy或者是tensorflow的基本运算和数据处理都会很模糊,所以花了一些时间来搞清楚 ...
- 图像处理算法的仿真平台之VGA时序
一 概述 图像处理算法一般是用matla或OpenCV实现的,若是用FPGA实现,设计思路差别极大.matlab和opencv的优势:这些工具的优势在于可以方便地载入图像文件,或输出数据到图像文件, ...
- Java 将Word转为XML,XML转为Word的方法
本文介绍将Word和XML文档进行双向互转的方法.转换时,Word支持.docx/.doc等格式. 代码环境如下: Word测试文档:.docx或.doc 编译环境:IntelliJ IDEA JDK ...
- PGSQL基础语句汇总
一.pgsql里面的数据类型不再介绍:https://www.runoob.com/postgresql/postgresql-data-type.html 二.常用基本语句 2.1.CREATE D ...