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 ...
随机推荐
- HAL库直流电机编码测速(L298N驱动)笔记
主函数开始后的处理流程: 1.外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfig() ...
- python使用笔记28--unittest单元测试框架
单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...
- JDK环境配置: javac is not recognized as an internal or external command, operable program or batch file
相信大家在配置TestNG的时候,首先都会去确认JDK的安装是否正确,两个命令缺一不可. 打开'cmd' --> 1. 输入'java -version', 返回java home当前路径. j ...
- SQLITE数据库不支持远程访问
SQLITE数据库不支持远程访问 import sqlite3 conn=sqlite3.connect("dailiaq.db") cur=conn.cursor() def c ...
- C语言:警告提示及解决方法
#include <stdio.h> int main(){ struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group ...
- python之数据驱动Txt操作
一.新建数据Mail163.txt文本 二.Txt_Mail163.py脚本如下: import unittestfrom selenium import webdriverfrom selenium ...
- C++:常量
/** https://www.runoob.com/cplusplus/cpp-constants-literals.html * 常量: 固定值,一旦定义不能被修改 * 整数常量:可以是十进制.八 ...
- Lesson 12 Life on a desert island
Lesson 12 Life on a desert island desert island ['dezət 'ailənd] n. 荒岛 uninhabited island coral isla ...
- Scanner的基本语法及用法
一.Scanner对象 基本语法中并没有实现程序和人的交互,但是Java给我们提供了一个这样的工具类,我们可以获取用户的输入.java.util.Scanner是Java5的新特征,我们可以通过Sca ...
- C++第四十三篇 -- VS2017创建控制台程序勾选MFC类库
用VS2017创建EXE带MFC类库方法 1. File --> New --> Project 2. Windows桌面向导 3. 勾选MFC类库 4. 创建成功 如果项目编译出错 1. ...