先看目录结构

再看pom需要的资源
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
实现要分三个步骤
1.配置websocketconfig.java文件
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* 开启支持websocket连接
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
2.实现客户端实体类
package com.example.demo.entity;
import javax.websocket.Session;
import java.io.Serializable;
public class Client implements Serializable {
private static final long serialVersionUID = 124315667583324L;
private String userName;
private Session session;
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName = userName;
}
public Session getSession(){
return session;
}
public void setSession(Session session){
this.session = session;
}
public Client (String userName,Session session){
this.session = session;
this.userName = userName;
}
public Client(){
}
}
- 实现websocket服务类
package com.example.demo.server;
import com.example.demo.entity.Client;
import com.sun.jmx.snmp.daemon.CommunicatorServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
@ServerEndpoint("/hello/{id}")
@Component
public class DemoServer {
/**
* 创建控制台打印对象
*/
private static final Logger logger = LoggerFactory.getLogger(CommunicatorServer.class);
/**
* 创建Client的Set集合
*/
private static CopyOnWriteArraySet<Client> socketServer = new CopyOnWriteArraySet<>();
/**
* 创建一个session对象
*/
private Session session;
/**
* 客户端实现websocket连接服务器
*
* @param session
* @param username
*/
@OnOpen
public void open(Session session, @PathParam(value = "id") String username) {
this.session = session;
socketServer.add(new Client(username, session));
logger.info("连接成功:{}", username);
}
@OnClose
public void onClose() {
socketServer.forEach(client -> {
if (client.getSession().getId().equals(session.getId())) {
logger.info("客户端:{}断开连接", client.getUserName());
socketServer.remove(client);
}
});
}
@OnError
public void onError(Throwable error) {
socketServer.forEach(client -> {
if (client.getSession().getId().equals(session.getId())) {
socketServer.remove(client);
logger.error("客户端{}发生异常", client.getUserName());
error.printStackTrace();
}
});
}
}
最后在进行测试:
websocket = new WebSocket("ws://127.0.0.1:8080/hello/lion狮子")
结果:
2020-05-26 12:09:03.213 INFO 5472 --- [nio-8080-exec-1] c.s.jmx.snmp.daemon.CommunicatorServer : 连接成功:lion狮子
2020-05-26 12:09:10.650 INFO 5472 --- [nio-8080-exec-3] c.s.jmx.snmp.daemon.CommunicatorServer : 客户端:lion狮子断开连接
本文详细介绍了如何在Java SpringBoot项目中配置WebSocket,包括创建WebSocketConfig配置类,实现客户端实体类和WebSocket服务类,最终实现双通道的连接进行实时通信。通过这个教程,读者将能够掌握SpringBoot结合WebSocket的基本用法。

434

被折叠的 条评论
为什么被折叠?



