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 ...
随机推荐
- [NOI2000] 古城之谜
题目描述 给定 n 和 n 个信息,每个信息包含一个词性 a (只有三种:名,动,辅)和对应的词 mot ,形为" \(a.mot\) ".(一次可能多词性) 最后给一个长度不大于 ...
- IP数据包格式与ARP转发原理
一.网络层简介1.网络层功能2.网络层协议字段二.ICMP与封装三.ARP协议与ARP欺骗1.ARP协议2.ARP欺骗 1.网络层功能 1. 定义了基于IP地址的逻辑地址2. 连接不同的媒介3. 选择 ...
- etcd的使用
etcd的使用 什么是etcd etcd的特点 etcd的应用场景 服务注册与发现 消息发布和订阅 负载均衡 分布式通知与协调 分布式锁 分布式队列 集群监控与Leader竞选 参考 etcd的使用 ...
- shell脚本(3)-格式化输出
一个程序需要有0个或以上的输入,一个或更多输出 一.echo语法 1.功能:将内容输出到默认显示设备. echo命令功能在显示器上显示一段文字,一般提到提示的作用 2.语法:echo[-ne][字符串 ...
- React 组件间通信 总结
组件间通信 5.1.1. 方式一: 通过props传递 1) 共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 2) 通过props可以传递一般数据和 ...
- SpringMvc接受请求参数的几种情况演示
说明: 通常get请求获取的参数是在url后面,而post请求获取的是请求体当中的参数.因此两者在请求方式上会有所不同. 1.直接将接受的参数写在controller对应方法的形参当中(适用于get提 ...
- Eclipse配置反编译插件jadclipse
参考自:https://blog.csdn.net/moneyshi/article/details/79715891 Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java ...
- Win10强制程序高DPI缩放设置
起因 工作原因,需要在win10上安装数个古老vc版本(vc6,vc2008,vc2010),但是显示器是2K的,DPI缩放有问题 尝试 VC6比较好解决:右键,属性,兼容性,更改高DPI设置,勾选替 ...
- 剖根问底:Java 不能实现真正泛型的原因是什么?
大家好,我是二哥呀! 今天我来给大家讲一下,Java 不能实现真正泛型的原因是什么? 本文已同步至 GitHub <教妹学 Java>专栏,风趣幽默,通俗易懂,对 Java 初学者亲切友善 ...
- 【阿菜用工具】Slither:Solidity静态分析框架
工具简介 Slither 是一个 python3 开发,用于检测智能合约(solidity)漏洞的静态分析框架. Slither 的 Github 地址:https://github.com/cryt ...