前几天有个 websocket 通信的需求,百度各种使用方法五花八门,所以打算写个博客记录一下
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
编写 websocket 服务
package org.wq.study.javastudyserver.config.socket;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint(value = "/chat/{username}")
@Component
@Slf4j
public class SocketServer {
private ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();
/**
* 创建连接
*/
@OnOpen
public void onOpen(Session session, @PathParam(value = "username") String username) {
sessionMap.put(username, session);
log.info("{}创建连接", username);
}
/**
* 服务端收到客户端消息
*/
@OnMessage
public void onMessage(String msg,@PathParam(value = "username") String username){
log.info("{}说:{}",username,msg);
}
/**
* 连接关闭
*/
@OnClose
public void onClose(Session session, @PathParam(value = "username") String username){
log.info("{}关闭连接", username);
}
/**
* 连接异常
*/
@OnError
public void onError(Throwable throwable,@PathParam(value = "username") String username){
log.error("{}连接发生异常", username);
}
/**
* 发消息
*/
private void sendMessage(Session toSession,String msg){
try {
toSession.getBasicRemote().sendText(msg);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
注解含义解释:
@ServerEndPoint: 把当前类定义成 websocket 服务器端
@Component: 当前类可以被 Spring 框架自动扫描成 bean 实例并装入 Spring 容器中
@Slf4j: Lombok提供的注解,自动生成一个名为 log
的日志对象
流程解读:
服务端可以通过 @OnOpen @OnMessage @OnClose @OnError 等监听 websocket 事件
1. 客户端连接 socket 时,通过 @OnOpen 获取用户信息存入 session 中;
2. 通过 @OnMessage 监听客户端连接 socket 发过来的消息
3. 根据接收客户端消息内容,推送消息给客户端(根据实际使用场景推送给某个人/某些人/所有人)
4. @OnClose 监听用户关闭连接(用户关闭连接要删除 session 存入的对应用户)
5. @OnError 连接异常
配置 websocket
config 配置文件
package org.wq.study.javastudyserver.config.socket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
至此,websocket 服务就搭建好了。