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_fig;
import t.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;
slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import urrent.ConcurrentHashMap;
/**
* @ServerEndpoint 注解的作⽤
*
* @ServerEndpoint 注解是⼀个类层次的注解,它的功能主要是将⽬前的类定义成⼀个websocket服务器端,
* 注解的值将被⽤于监听⽤户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
/**
* 与某个客户端的连接对话,需要通过它来给客户端发送消息
*/
websocket和socketprivate 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(){
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 {
<(name).BasicRemote().sendText(message); }catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 指定发送
* @param name
* @param message
*/
public void AppointSending(String name,String message){
try {
<(name).BasicRemote().sendText(message); }catch (Exception e){
e.printStackTrace();
}
}
}
因java代码中这样定义的消息,可以指定发送某个⼈,测试
到此这篇关于springboot整合websocket最基础⼊门使⽤教程详解的⽂章就介绍到这了,更多相关springboot整合websocket⼊门内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论