Springboot整合Websocket
引入maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置springboot
server:
port: 5003
编写 ApplicationConfig 类配置websocket
@Configuration
public class ApplicationConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
核心代码
- @ServerEndpoint(“/api/pushMessage/{userId}”) 前端通过此 URI 和后端交互,建立连接
- @Component 将此类交给 spring 管理
- @OnOpen websocket 建立连接的注解,前端触发上面 URI 时会进入此注解标注的方法
- @OnMessage 收到前端传来的消息后执行的方法
- @OnClose 顾名思义关闭连接,销毁 session
- 因为WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其实就相当于一个ws协议的Controller
- 新建一个ConcurrentHashMap webSocketMap 用于接收当前userId的WebSocket,方便IM之间对userId进行推送消息
测试代码
@Component
@Slf4j
@ServerEndpoint("/api/pushMessage/{userId}")
public class MyWebsocket {
private Session session;
private String userId;
private static ConcurrentHashMap<String,MyWebsocket> webSocketSet = new ConcurrentHashMap<>();
/**
* 连接建立成功调用的方法
* session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void OnOpen(Session session, @PathParam(value = "userId") String userId){
log.info("----------------------------------");
this.session = session;
this.userId = userId;
// userId是用来表示唯一客户端,如果需要指定发送,需要指定发送通过userId来区分
webSocketSet.put(userId,this);
log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());
log.info("----------------------------------");
log.info("");
GroupSending(userId+" 来了");
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void OnClose(){
webSocketSet.remove(this.userId);
log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());
GroupSending(userId+" 走了");
}
/**
* 收到客户端消息后调用的方法
*/
@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();
}
}
}
测试websocket
在线测试websocket网站: http://coolaf.com/tool/chattest