1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、配置类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import com.voice.handle.WebSocketHandler;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private WebSocketHandler webSocketHandler;
@Autowired
private WebSocketInterceptor webSocketInterceptor;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/ws")
.addInterceptors(webSocketInterceptor)
.setAllowedOrigins("*");
}
}
WebSocketHandler 为实际处理类
WebSocketInterceptor 为拦截器
/ws 为websocket连接路径
3、拦截器
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import java.util.Map;
@Component
public class WebSocketInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
// Do something before handshake
System.out.println("Handshake started");
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
// Do something after handshake
System.out.println("Handshake completed");
}
}
4、处理类
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.UUID;
@Component
public class WebSocketHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("Received message: " + message.getPayload());
session.sendMessage(new TextMessage("Received message: " + message.getPayload()));
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String sid = UUID.randomUUID().toString().replaceAll("-", "");
WsSessionManager.addSession(session, sid);
System.out.println("Connection established: " + sid);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.out.println("Transport error: " + exception.getMessage());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
System.out.println("Connection closed: " + closeStatus.getReason());
session.close();
WsSessionManager.removeSession(session);
}
}
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class WsSessionManager {
private static Map<WebSocketSession, String> sessionMap = new ConcurrentHashMap<>();
public static void addSession(WebSocketSession session, String sid) {
sessionMap.put(session, sid);
}
public static void removeSession(WebSocketSession session) {
sessionMap.remove(session);
}
public static void sendMsg(WebSocketSession session, String msg) {
if (session.isOpen()) {
System.out.println("send msg to " + sessionMap.get(session) + ": " + msg);
try {
session.sendMessage(new TextMessage(msg));
} catch (Exception e) {
System.out.println("send msg error: " + e.getMessage());
}
}
}
}