springboot 加入 websocket
一、引入 spring-websocket 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
二、开启 websocket 支持
/**
* 开启websocket的支持
*/
@Configuration
public class WebsocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
三、websocket 工具类
/**
* websocket工具类
*/
@Slf4j
public class WebsocketUtil {
private WebsocketUtil() {
}
/**
* 服务端存放客户端对应的session对象
* key:clientId value:session
*/
public static final Map<String, Session> WEBSOCKET_CLIENT_SESSION_MAP = Maps.newConcurrentMap();
/**
* 服务端发送消息给所有客户端
*
* @param message
*/
public static void sendMessageToAllClient(String message) {
if (WEBSOCKET_CLIENT_SESSION_MAP.isEmpty()) {
log.info("当前无连接的客户端, 消息忽略推送.");
return;
}
WEBSOCKET_CLIENT_SESSION_MAP.forEach((sessionId, session) -> {
try {
session.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端向客户端[{}]发送消息异常.", sessionId, e);
}
});
}
}
四、websocket 服务端
/**
* websocket服务端
*/
@Slf4j
@Component
@ServerEndpoint("/websocket")
public class WebsocketServer {
private String sessionId;
/**
* websocket建立连接
*
* @param session
* @throws IOException
*/
@OnOpen
public void onOpen(Session session) throws IOException {
this.sessionId = session.getId();
if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(this.sessionId)) {
WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(this.sessionId).close();
}
WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.put(this.sessionId, session);
log.info("客户端[{}]建立websocket连接.", this.sessionId);
}
/**
* 关闭socket连接
*
* @param session
*/
@OnClose
public void onClose(Session session) {
if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(session.getId())) {
WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(session.getId());
log.info("客户端[{}]断开websocket连接.", session.getId());
}
}
/**
* 接收到消息
*
* @param message
*/
@OnMessage
public void OnMessage(String message) {
log.info("接收到客户端{}发送的消息:[{}].", this.sessionId, message);
}
/**
* 连接错误
*
* @param session
* @param error
*/
@OnError
public void OnError(Session session, Throwable error) {
log.error("websocket连接错误,", error);
}
}
五、测试
推荐使用 Chrome 插件——Simple Web Socket Client