Java SpringBoot实现打开websocket双通道的连接

本文详细介绍了如何在Java SpringBoot项目中配置WebSocket,包括创建WebSocketConfig配置类,实现客户端实体类和WebSocket服务类,最终实现双通道的连接进行实时通信。通过这个教程,读者将能够掌握SpringBoot结合WebSocket的基本用法。

先看目录结构
在这里插入图片描述
再看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(){
    }
}
  1. 实现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狮子断开连接
专业牙齿影像蛀牙分割数据集:多类别蛀牙区域精细分割本数据集包含400张高精度口腔内窥镜或X光影像,覆盖多种常见的蛀牙形态、位置(如咬合面、邻面)与严重程度,确保模型能够学习到蛀牙在不同牙齿上的多样化表现。所有影像均经过专业牙科医生进行像素级精细标注,蛀牙区域掩膜精准。数据集已统一预处理为512x512像素,并划分为训练集与验证集。图像采用标准PNG格式,配套的单通道标注图中像素值对应以下6类精细分割目标:• 0:背景/健康牙体• 1:一类龋(釉质浅龋)• 2:二类龋(牙本质中龋)• 3:三类龋(深龋近髓)• 4:窝沟龋• 5:邻面龋本数据集专为U-Net、DeepLab等先进的医学影像分割网络设计,适用于自动化蛀牙检测、分类与程度评估等研究。随附专业分析脚本,可一键生成各类蛀牙的面积统计、样本对比可视化及颜色特征分析图表,帮助您快速掌握数据分布,优化模型训练策略。该数据集结构清晰、标注专业,是口腔医学影像AI研究的理想基础数据,适用于龋病辅助诊断算法发、学术研究及教学演示。基于本数据训练的模型,可为早期蛀牙筛查、精准治疗规划提供重要的定量化参考。高质量的口腔影像分割数据是推动牙科AI临床应用的关键。我们提供这套由专家标注的蛀牙分割数据集,旨在助力您构建高精度、可解释的智能蛀牙诊断模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值