pom文件引入websocket依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.4.13</version>
</dependency>
注入websocket
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
websocket服务类
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.RandomUtil;
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("/websocket/{id}")
@Component
@Slf4j
public final class WebSocket {
private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();
private Session session;
private String id;
/**
* 单机消息推送
*
* @param id 唯一标识id
* @param message 消息内容
*/
public static void sendWebSocketMessage(String id, String message) {
try {
sessionMap.forEach((keyId, pushSession) -> {
if (id.contains(CharSequenceUtil.split(keyId, StrPool.UNDERLINE).get(0)) &&
(pushSession != null && pushSession.isOpen())) {
pushSession.getAsyncRemote().sendText(message);
}
});
} catch (Exception e) {
log.error("websocket sendWebSocketMessage exception: {}", e.getMessage());
}
}
/**
* 链接成功调用的方法
*
* @param session 连接会话
* @param id 唯一标识id
*/
@OnOpen
public void onOpen(Session session, @PathParam(value = "id") String id) {
this.session = session;
this.id = id + StrPool.UNDERLINE + RandomUtil.randomString(10);
sessionMap.put(this.id, session);
log.info("【websocket消息】 连接成功,id: {}" + this.id);
}
/**
* 链接关闭调用的方法
*/
@OnClose
public void onClose() {
sessionMap.remove(this.id);
try {
this.session.close();
} catch (Exception e) {
log.error("websocket onClose exception: {}", e.getMessage());
}
}
/**
* 接收消息事件, 监测心跳
*
* @param message 消息内容
*/
@OnMessage
public void onMessage(String message) {
this.session.getAsyncRemote().sendText("connection normal");
}
/**
* 发送错误时的处理
*
* @param session 连接会话
* @param error 异常信息
*/
@OnError
public void onError(Session session, Throwable error) {
sessionMap.remove(this.id);
try {
session.close();
} catch (Exception e) {
log.error("websocket onError exception: {}", error.getMessage());
}
}
}
发送消息
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class SendMessageSingle {
/**
* 消息推送单人
*
* @param id 唯一标识id
* @param message 消息内容
*/
public void sendOneMessage(String id, String message) {
WebSocket.sendWebSocketMessage(id, message);
}
/**
* 消息推送多人
*
* @param ids 唯一标识id
* @param message 消息内容
*/
public void sendMoreMessage(List<String> ids, String message) {
ids.forEach(id -> WebSocket.sendWebSocketMessage(id, message));
}
}
测试连接