WebSocket是一种长监听,它实现了浏览器与服务器双工通信—浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
1.添加WebSocket依赖
<!-- WebSocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.创建 WebSocket 配置类:需要为 WebSocket 创建一个配置类,启用 WebSocket 支持,并注册 WebSocket 端点。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @Datetime 2024年11月15日 14:51
* @ClassName: WebsocketConfig
* @Description: TODO
* @Version 1.0
*/
@Configuration
public class WebsocketConfig {
/**
* 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
* @date 2024/11/15 9:19
* @return ServerEndpointExporter
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
3.实现 WebSocket 处理器:处理 WebSocket 消息的核心类
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.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Datetime 2024年11月15日 14:56
* @ClassName: WsServerEndpoint
* @Description: TODO 监听Websocket接口myWs
* @Version 1.0
*/
@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {
private static Map<String,Session> sessions = new ConcurrentHashMap<>();
/**
* 连接成功
*
* @param session
*/
@OnOpen
public void onOpen(Session session) {
System.out.println("打开连接");
sessions.put(session.getId(),session);
}
/**
* 连接关闭
*
* @param session
*/
@OnClose
public void onClose(Session session) {
System.out.println("关闭连接");
sessions.remove(session.getId());
}
/**
* 接收到消息
*
* @param text
*/
@OnMessage
public void onMsg(String text) throws IOException {
System.out.println("收到消息:"+text);
sendMessage(text);
}
/**
* 推送消息
* getAsyncRemote获取异步端点(推荐使用这个)
* getBasicRemote获取阻塞端点(不推荐,如果第一次发送失败,就会一直阻塞,影响后面的进行)
*/
public void sendMessage(String message){
sessions.forEach((k,v)->{
try {
v.getAsyncRemote().sendText(message);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
}
我们需要发送消息的时候,只需要调用核心类中的sendMessage方法就可以了
4.验证功能
新版Postman支持创建websocket
项目启动成功后我们需要连接ws://localhost:项目端口/myWs地址就可以监听到我们发送的消息了