一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
二、配置
1.方法一——Java EE——使用@ServerEndpoint自定义服务端
@Configuration
public class WebSocketConfig{
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
@ServerEndpoint(value = "/websocket1/{param}")
@Component
public class WebSocketServer {
private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session,@PathParam("param") String param) {
Console.log("Connection opened: " + session.getId());
Console.log(param);
sessions.add(session);
}
@OnMessage
//服务器接收消息
public void onMessage(String message) {
Console.log("Received message: " + message);
}
@OnClose
public void onClose(Session session) {
Console.log("Connection closed: " + session.getId());
sessions.remove(session);
}
@SneakyThrows
public void sendToAllClient(String message) {
for (Session session : sessions) {
//发送消息到连接端
session.getBasicRemote().sendText("Server received: " + message);
}
}
}
@RestController
public class WebSocketController {
@Resource
WebSocketServer webSocketServer;
@GetMapping("/websocket")
public void socket(@RequestParam(value = "message") String message) {
webSocketServer.sendToAllClient(message);
}
}
2.方法二——SpringBoot——自定义Handler、Interceptor、Config
public class MyWebSocketHandler implements WebSocketHandler {
@Resource
WebSocketServer webSocketServer;
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
//连接后处理
webSocketServer.onOpen(webSocketSession);
}
@Override
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
//处理消息
System.out.println("客户端ID: " + webSocketSession.getId() + " 发送消息: " + webSocketMessage.getPayload());
}
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
//异常处理
}
@Override
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
//断开后处理
webSocketServer.onClose(webSocketSession);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
public class MyWebSocketInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
//握手前
ServletServerHttpRequest httpRequest = (ServletServerHttpRequest) serverHttpRequest;
String param = httpRequest.getServletRequest().getParameter("param");
Console.log("param: {}",param);
return true;
}
@Override
public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
//握手后
}
}
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Bean
public MyWebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
@Bean
public MyWebSocketInterceptor myWebSocketInterceptor(){
return new MyWebSocketInterceptor();
}
@Bean
public WebSocketServer myWebSocketServer(){
return new WebSocketServer();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry
.addHandler(myWebSocketHandler(),"/websocket")
.addInterceptors(myWebSocketInterceptor())
.setAllowedOrigins("*");
}
}
三、测试
ws://localhost:port/websocket 连接服务端。
localhost:port/websocket?message= 向客户端发送信息。