SpringBoot整合WebSocket【代码】

系列文章目录

一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】

二、SpringBoot连接Redis与Redisson【代码】

三、SpringBoot整合WebSocket【代码】


文章目录


代码下载地址

SpringBoot整合WebSocket【代码】


一、效果演示

测试链接

二、引入依赖

xml 复制代码
<!--    websocket    -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
  <version>2.1.1.RELEASE</version>
</dependency>

三、WebSocketConfig

java 复制代码
@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

四、SessionWrap

SessionWrap 可根据具体需求自定义

java 复制代码
@Data
public class SessionWrap {

    private String from;	// 连接Id

    private String type;	// 来凝结类型

    private Session session;

    private Date lastTime;
}

五、WebSocketServer

java 复制代码
@Slf4j
@Component
@ServerEndpoint(value = "/api/websocket/{from}/{type}")
public class WebSocketServer {

    @Autowired
    private MessageService messageService;

    public static WebSocketServer webSocketServer;

    // 所有的连接会话
    private static CopyOnWriteArraySet<SessionWrap> sessionList = new CopyOnWriteArraySet<>();

    private String from;
    private String type;

    @PostConstruct
    public void init() {
        webSocketServer = this;
        webSocketServer.messageService = this.messageService;
    }

    /**
     * @author Lee
     * @date 2023/7/18 13:57
     * @description 创建连接
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "from") String from, @PathParam(value = "type") String type) {
        this.from = from;
        this.type = type;
        try {
            // 遍历list,如果有会话,更新,如果没有,创建一个新的
            for (SessionWrap item : sessionList) {
                if (item.getFrom().equals(from) && item.getType().equals(type)) {
                    item.setSession(session);
                    item.setLastTime(new Date());
                    log.info("【websocket消息】更新连接,总数为:" + sessionList.size());
                    return;
                }
            }
            SessionWrap sessionWrap = new SessionWrap();
            sessionWrap.setFrom(from);
            sessionWrap.setType(type);
            sessionWrap.setSession(session);
            sessionWrap.setLastTime(new Date());
            sessionList.add(sessionWrap);
            log.info("【websocket消息】有新的连接,总数为:" + sessionList.size());
        } catch (Exception e) {
            log.info("【websocket消息】连接失败!错误信息:" + e.getMessage());
        }
    }

    /**
     * @author Lee
     * @date 2023/7/18 13:57
     * @description 关闭连接
     */
    @OnClose
    public void onClose() {
        try {
            sessionList.removeIf(item -> item.getFrom().equals(from) && item.getType().equals(type));
            log.info("【websocket消息】连接断开,总数为:" + sessionList.size());
        } catch (Exception e) {
            log.info("【websocket消息】连接断开失败!错误信息:" + e.getMessage());
        }
    }

    /**
     * @author Lee
     * @date 2023/7/18 14:04
     * @description 发送消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        try {
        	// 对消息进行处理
            JSONObject r = webSocketServer.messageService.insertMessage(message);
            String userId = r.getString("userId");
            for (SessionWrap item : sessionList) {
            // 发送消息的判断逻辑可根据需求修改
                if (item.getFrom().equals(userId) && item.getType().equals("test")) {
                    item.getSession().getBasicRemote().sendText(r.toJSONString());
                    log.info("【websocket消息】发送消息成功:" + r.toJSONString());
                }
            }
        } catch (Exception e) {
            log.info("【websocket消息】发送消息失败!错误信息:" + e.getMessage());
        }
    }

    @OnError
    public void onError(Session session, Throwable error) {

        log.error("用户错误,原因:"+error.getMessage());
        error.printStackTrace();
    }

}
相关推荐
!!!5254 小时前
日志技术-LogBack入门程序&Log配置文件&日志级别
spring boot
Ai 编码助手5 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花5 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
Channing Lewis5 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask
轩辕烨瑾7 小时前
C#语言的区块链
开发语言·后端·golang
feilieren7 小时前
SpringBoot 搭建 SSE
java·spring boot·spring
栗豆包8 小时前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
萧若岚9 小时前
Elixir语言的Web开发
开发语言·后端·golang
Channing Lewis9 小时前
flask实现重启后需要重新输入用户名而避免浏览器使用之前已经记录的用户名
后端·python·flask
Channing Lewis9 小时前
如何在 Flask 中实现用户认证?
后端·python·flask