首页 > 其他分享 >springboot+webSocket

springboot+webSocket

时间:2023-02-01 16:13:16浏览次数:36  
标签:webSocket springboot token session org import message public

1、新建WebSocketConfig配置类

package com.config;

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();
    }
}

2、新建具体业务socket

package com.socket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/sysMessageSocket/{token}")
@Component
@Slf4j
public class SysMessageWebSocket {
    private Session session;
    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
    private static CopyOnWriteArraySet<SysMessageWebSocket> webSocketSet = new CopyOnWriteArraySet<>();

    @OnOpen
    public void onOpen(Session session, @PathParam(value = "token") String token) {
        log.info("WebSocket建立连接中,连接用户ID:{}", token);
        try {
            Session historySession = sessionPool.get(token);
            if (historySession != null) {
                webSocketSet.remove(historySession);
                historySession.close();
            }
        } catch (IOException e) {
            log.error("重复登录异常,错误信息:" + e.getMessage(), e);
        }
        this.session = session;
        webSocketSet.add(this);
        sessionPool.put(token, session);
        log.info("建立连接完成,当前在线人数为:{}", webSocketSet.size());
    }

    @OnError
    public void one rror(Throwable throwable) {
        throwable.printStackTrace();
    }

    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        String token = this.session.getRequestParameterMap().get("token").get(0);
        log.info(token + "连接断开,当前在线人数为:{}", webSocketSet.size());
    }

    @OnMessage
    public void onMessage(String message) {
        log.info("收到客户端发来的消息:{}", message);
    }

    public void sendMessageByUser(String token, String message) {
        log.info("用户ID:" + token + ",推送内容:" + message);
        Session session = sessionPool.get(token);
        try {
            if(session!=null){
                session.getBasicRemote().sendText(message);
            }else{
                log.info("连接已断开,用户ID:" + token + ",内容推送失败:" + message + "。session为空。");
            }
        } catch (IllegalStateException | IOException e) {
            log.info("连接已断开,用户ID:" + token + ",内容推送失败:" + message + "。"+e.getMessage());
        }
    }

    public void sendAllMessage(String message) {
        log.info("发送消息:{}", message);
        for (SysMessageWebSocket webSocket : webSocketSet) {
            try {
                webSocket.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                log.error("群发消息发生错误:" + e.getMessage(), e);
            }
        }
    }

}

3、测试

通过 www.jsons.cn/websocket/ 测试本地socket是否互通

注意:

config配置文件WebSocketConfig的ServerEndpointExporter(服务器端点导出器)与@Test冲突(websocket是需要依赖tomcat等容器的启动)

方案:本地启用测试代码时需要将@Bean注掉(提交git的代码需要将Test代码注掉);

  新建测试类时,在springbootTest后添加内容webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT。

例如测试类为

package com.test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MicroenterpriseApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class VerifyCodeServiceImplTest {

    @Test
    public void getVerifyCode() {
        
    }
}

 

标签:webSocket,springboot,token,session,org,import,message,public
From: https://www.cnblogs.com/xiufengd/p/17083155.html

相关文章

  • SpringBoot整合druid数据源
    SpringBoot默认使用HikariDataSource,但也可以整合外部DataSource。下面介绍SpringBoot_Druid整合整合有两种方式:1、starter整合 2、自定义整合1、starter整合2、自定......
  • SpringBoot 前端大文件上传
    ​ 最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的......
  • springboot Config类@Import导入Config类中bean覆盖方法
    spring-cloud-openfeign-core第三方包里面有FeignClientsConfiguration.class里面是包括了feign需要的bean,但里面已经定义了feignEncoder、feignDecoder,如果项目中想要定制......
  • 初次使用 WebSocket -springboot 集成
    参考自:SpringBoot集成websocket_清泉影月的博客-CSDN博客,WebSocket中利用service层交互数据库_戒烟的李白的博客-CSDN博客_websocketservice核心依赖<dependency>......
  • SpringBoot2.0版本与老版本区别
    SpringBoot2.0版本新特性 以Java8为基准SpringBoot2.0要求Java版本必须8以上,Java6和7不再支持。内嵌容器包结构调整为了支持reactive使用场景,内嵌的容器包结构......
  • SpringBoot实现热部署
    在项目开发的过程中,会频繁修改类的代码,导致需要重新编译、启动,影响开发效率。SpringBoot提供了spring-boot-devtools组件,使代码改动后,无须手动重启SpringBoot应用即可重......
  • SpringBoot设置日志级别
    输出到控制台logging:#日志记录到文件中file:#指定文件名name:server.loglogback:rollingpolicy:#指定文件大小max-file-size......
  • vue+springboot集成钉钉扫码登录
    具体接入方式可参考官方介绍:https://open.dingtalk.com/document/orgapp-server/tutorial-obtaining-user-personal-information本文只演示vue+springboot如何实现钉钉扫......
  • SpringBoot 开发抖音开放平台获取用户的粉丝统计和短视频数据
    大家好,我是小悟​抖音开放平台刚面世不久,资料比较少。即使对于一个开发人员来说,接入第三方接口都大同小异,不会太难,但我还是想把这些记录下来,特别是遇到的坑,会列在下面,一起参......
  • SpringBoot项目前端使用vue下载后端resources下的文件(导出模板)
     放到resources/xls/import-template.xls这个路径可以自己修改代码同步修改即可 @GetMapping(value="/downloadXls")@ApiOperation(value="下载导入模板"......