springboot整合websocket最基础入门使用教程详解
作者:小哇666 发布时间:2023-11-30 00:20:24
标签:springboot,整合,websocket
项目最终的文件结构
1 添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2 编写配置类 WebSocketConfig
package cn.huawei.socket_test_1.config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Component
public class WebSocketConfig {
/**
* ServerEndpointExporter 作用
*
* 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
*
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3 编写核心业务类 WebSocket
package cn.huawei.socket_test_1.websock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;
/**
* @ServerEndpoint 注解的作用
*
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
/**
* 与某个客户端的连接对话,需要通过它来给客户端发送消息
*/
private Session session;
/**
* 标识当前连接客户端的用户名
*/
private String name;
/**
* 用于存所有的连接服务的客户端,这个对象存储是安全的
* 注意这里的kv,设计的很巧妙,v刚好是本类 WebSocket (用来存放每个客户端对应的MyWebSocket对象)
*/
private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();
/**
* 连接建立成功调用的方法
* session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void OnOpen(Session session, @PathParam(value = "name") String name){
log.info("----------------------------------");
this.session = session;
this.name = name;
// name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
webSocketSet.put(name,this);
log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());
log.info("----------------------------------");
log.info("");
GroupSending(name+" 来了");
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void OnClose(){
webSocketSet.remove(this.name);
log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());
GroupSending(name+" 走了");
}
/**
* 收到客户端消息后调用的方法
*/
@OnMessage
public void OnMessage(String message_str){
log.info("[WebSocket] 收到消息:{}",message_str);
//判断是否需要指定发送,具体规则自定义
//message_str的格式 TOUSER:user2;message:aaaaaaaaaaaaaaaaaa;
if(message_str.indexOf("TOUSER") == 0){
//取出 name和message的值
String[] split = message_str.split(";");
String[] split1 = split[0].split(":");
String[] split2 = split[1].split(":");
String name = split1[1];
String message = split2[1];
//指定发送
AppointSending(name,message);
}else{
//群发
GroupSending(message_str);
}
}
/**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
log.info("发生错误");
error.printStackTrace();
}
/**
* 群发
* @param message
*/
public void GroupSending(String message){
for (String name : webSocketSet.keySet()){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 指定发送
* @param name
* @param message
*/
public void AppointSending(String name,String message){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
4 因前端不熟悉,所以使用 http://coolaf.com/tool/chattest 在线测试
因代码中 @ServerEndpoint("/websocket/{name}") 是这样定义的,所以 通过下面的方式连接上去,测试群发和指定发送
因java代码中这样定义的消息,可以指定发送某个人,测试
来源:https://blog.csdn.net/qq_41712271/article/details/115111987


猜你喜欢
- Long end,long num,File file,String charset4个参数说明end 相当于坐标 ,tail 向上的起点,
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下首先来看一下我们要做成的而效果:主页面要显示一个view
- 暂停和恢复Activity(Pausing and Resuming an Activity)一个Activity是一个应用程序组件,提供一
- Android 动画实现几种方案在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画、视图/
- 1:引入依赖<dependency> <
- 本期文章源码:GitHub一文彻底搞懂《并查集》!概念并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。
- 本文实例讲述了Java基于解释器模式实现定义一种简单的语言功能。分享给大家供大家参考,具体如下:一 模式定 * 释器模式:就是给定一个语言的文
- 状态活动存放在一个叫返回栈的一个集合,当重新打开一个Activity时,它就会出现在栈顶。当要销毁该活动时,调用finish()或back,
- 目录基于Java的guava开源库工具类1、guava的maven配置引入 2、LoadingCache3、Multimap 和
- Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。Java
- 前置工作:项目配置升到对应的29版本compileSdkVersion: 29,buildToolsVersion: ‘29.0.0'
- 一 、ProgressDialogProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态。Prog
- 本文实例为大家分享了C#十五子游戏的具体代码,供大家参考,具体内容如下using System;using System.Collectio
- 一:在函数入参中使用通配符@AspectJ支持3种通配符* :匹配任意字符,但它只能匹配上下文中的一个元素... :匹配任意字符,可以匹配上
- Android音乐播放器的运行效果这篇博客还是接着上一篇Android音乐播放器制作写的,没看过的可以去看看。其中这个效果(圆形ImageV
- 介绍意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活。主要解决:我们扩展一个类常使用继承方式实现,由于继
- 实现窗口小部件,访问手机储存卡指定目录中的图片文件,然后随机选择一张在窗口的小部件中显示。图片路径使用List存储,适合初级Android学
- 先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK。。注意:
- 这个是常见的对二叉树的操作。总结一下:设节点的数据结构,如下:class TreeNode { char
- 什么是sam 转换Single Abstract Method 实际上这是java8中提出的概念,你就把他理解为是 一个方法的接口 的就可以