后端使用websocket主动向前端发送消息
依赖configorg.springframework.boot spring-boot-starter-websocketorg.springframework.boot spring-boot-starter-thymeleaf
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
util
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
@ServerEndpoint("/websocket")
@Component
public class WebSocket {
// 与某个客户端的连接会话,需要通过他来给客户端发送数据
private Session session;
//concurrent包的线程安全set,用来存放每个客户端对应的websocket对象
private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>();
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocket.class);
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSockets.add(this);
LOGGER.info("【websocket消息】 有新的连接,总数{}", webSockets.size());
}
@OnClose
public void onClose() {
this.session = session;
webSockets.remove(this);
LOGGER.info("【websocket消息】 连接断开,总数{}", webSockets.size());
}
@OnMessage
public void onMessage(String message) {
LOGGER.info("【websocket消息】 收到客户端发来的消息:{}", message);
}
public void sendMessage(String message) {
LOGGER.info("【websocket消息】 发送消息:{}", message);
for (WebSocket webSocket : webSockets) {
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
效果



