springboot使用websocket简单demo
导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.13</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
编写两个配置
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
public class WebSocketServer extends ServerEndpointConfig.Configurator {
//鉴权
@Override
public boolean checkOrigin(String originHeaderValue) {
return true;
}
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
Map<String, List<String>> parameterMap = request.getParameterMap();
//erp为连接标识符,前端传
List<String> erp = parameterMap.get("erp");
if (!CollectionUtils.isEmpty(erp)){
sec.getUserProperties().put("erp",erp.get(0));
}
}
}
测试
@Slf4j
@Component
@ServerEndpoint(value = "/ws/test", configurator = WebSocketServer.class)
public class WebSocketService {
//在线连接数
private static AtomicInteger onlineCount = new AtomicInteger(0);
//在线客户端
private static Map<String, WebSocketService> clients = new ConcurrentHashMap<>();
//每个连接的会话
@Getter
private Session session;
//标识当前会话
private String erp = "";
@OnOpen
public void onOpen(Session session, EndpointConfig config) throws IOException {
Map<String, Object> userProperties = config.getUserProperties();
String s = (String) userProperties.get("erp");
this.erp = s;
this.session = session;
//在线
if (clients.containsKey(this.erp)){
clients.get(this.erp).session.close();
clients.remove(this.erp);
onlineCount.decrementAndGet();
}
clients.put(this.erp,this);
onlineCount.getAndIncrement();
log.info("新连接加入:{},当前在线人数:{}",this.erp,onlineCount.get());
}
@OnMessage
public void onMessage(String message,Session session) throws IOException {
log.info("服务端收到客户端[{}]的消息:{}", this.erp, message);
//心跳机制
if (message.equals("ping")) {
this.sendMessage("pong", session);
}
}
public void sendMessage(String message, Session session) {
log.info("服务端给客户端[{}]发送消息{}", this.erp, message);
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.error("{}发送消息发生异常,异常原因{}", this.erp, message);
}
}
@OnClose
public void close() throws IOException {
if (clients.containsKey(erp)){
clients.get(erp).session.close();
clients.remove(erp);
onlineCount.decrementAndGet();
log.info("关闭连接{},在线人数{}",this.erp,onlineCount);
}
}
}
效果