WebSocket后端搭建,避坑指南

这篇具有很好参考价值的文章主要介绍了WebSocket后端搭建,避坑指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

网上有很多写WebSocket搭建的案例,我这里也是主要记录一下,我在部署WebSocket上踩到的坑。案例主要是给自己记录一下
我这里是用SpringBoot 搭建的WebSocket
首先就是配置类的代码

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

在之后就是WebSocket的核心代码,消息的接收和连接的建立都是基于这个类

// 这里我写的是@Service 是因为我把这个类写在Service层
@Service
@ServerEndpoint("/webSocket/{userId}")
public class WebSocketServerImp{
/**
	这里解释一下为什么要加ApplicationContext 因为spring是单例设计而websocket 是一个多实例类,每次建立连接都会有一个新的webSocket类所以@Autowired这类自动注入注解是不起效果的,所以每次需要通过上下文来获取实例
*/
private static ApplicationContext applicationContext;
 /**concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。*/
private static ConcurrentHashMap<Long,Session> webSocketMap = new ConcurrentHashMap<>();
 public static void setApplicationContext(ApplicationContext applicationContext) {
        WebSocketServerImp.applicationContext = applicationContext;
    }
    /**
     * 连接建立成
     * 功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Long userId) {
        webSocketMapper = applicationContext.getBean(WebSocketMapper.class);
        this.userId = userId;
        if(webSocketMap.containsKey(userId)){
            webSocketMap.remove(userId);
            //加入set中
            webSocketMap.put(userId,session);
        }else{
            //加入set中
            webSocketMap.put(userId,session);
        }
        
         }
    /**
     * 连接关闭
     * 调用的方法
     */
    @OnClose
    public void onClose() {

    }
    /**
     * 收到客户端消
     * 息后调用的方法
     * @param jsonMessage
     * 客户端发送过来的消息
     **/
    @OnMessage
    public void onMessage(String jsonMessage) {
    
        }
        /**
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用户错误:"+this.userId+",原因:"+error.getMessage());
        error.printStackTrace();
    }

}

因为我们在@ServerEndpoint这个类里面加了private static ApplicationContext applicationContext;,也有set方法那我们也应该在哪里set呢?答案是启动类,从启动类获取上下文,然后set
启动类代码:

@SpringBootApplication
@MapperScan("com.xxx.server.mapper")
public class YebApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(YebApplication.class, args);
        WebSocketServerImp.setApplicationContext(applicationContext);
    }
}

webSocket 的代码到这里就结束了。下面来说一下有那些坑
1、需不需要加@Service或@Component?网络上有些人说@ServerEndpoint本身就有@Component我尝试不要这种bean注册注解,我的@ServerEndpoint是没有自带bean注册注解的,可能是版本问题吧,我觉得是需要加的加了规范一点,至少让别人看你类的时候也会舒服一点
2、@OnError 这个类里面的形参必须要有Throwable error这个形参,不然你的@ServerEndpoint会注册失败
3、@OnClose 这个类里面的形参不能有任何参数,不然就是注册失败,这个坑我踩了很久!
4、在@ServerEndpoint中@Autowired这类自动注入注解失败问题,这个问题我在上面的代码注释里面也说了,主要原因就是spring和websocket犯冲,一个是单例,一个是多例

最近又踩了一个坑,WebSocket connection to XXXX,在csdn上copy的代码,上面有那种多余的依赖包,我添加上去之后,在webSocket的类上加上@Component这类的注解就是报错,不添加的话前端就会连接不到WebSocket,依赖的话就我上面写的就够了。文章来源地址https://www.toymoban.com/news/detail-419024.html

到了这里,关于WebSocket后端搭建,避坑指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES避坑指南

    分片是一个功能完整的搜索引擎,它拥有使用一个节点上的所有资源的能力。 索引一旦创建分片数量就已经确定,且不可更改,默认为5个分片,每个分片有1个副本 _index: 索引名,这个名字必须小写,不能以下划线开头,不能包含逗号 _type: 索引下的逻辑分区 一个 _type 命名可

    2023年04月09日
    浏览(39)
  • Prisma 避坑指南!

    环境变量问题 npx prisma db push 默认取 .env 配置文件,那多环境怎么处理? 增加 .env.test .env.prod 等文件, 安装 dotenv-cli ,执行 dotenv -e .env.test -- npx prisma db push 来指定 prisma 的运行环境 实际项目中与 nodejs (koa、egg、midway、nest)等框架结合使用时,如 midway.js ,包含内置配置文件为

    2024年02月11日
    浏览(32)
  • 数据结构入门指南:链表(新手避坑指南)

    目录 前言 1.链表 1.1链表的概念  1.2链表的分类 1.2.1单向或双向 1.2.2.带头或者不带头 1.2.33. 循环或者非循环 1.3链表的实现  定义链表 总结         前边我们学习了顺序表,顺序表是数据结构中最简单的一种线性数据结构,今天我们来学习链表,难度相较于顺序表会大幅增

    2024年02月15日
    浏览(56)
  • 项目管理软件选择指南:最佳实践与避坑指南

    当今企业中,协作工具是必不可少的,每个企业都会寻找最适合自己的协作工具来提高工作效率。在这些协作工具中,Zoho Projects项目协作工具是最常用的一种,因为它能够为团队提供一个集任务、项目、文档、IM、目标、日历、甘特图、工时、审批等多个功能于一体的协作环

    2024年02月16日
    浏览(45)
  • 2023软件测试面试避坑指南

    今年2023整体IT行业不景气,大厂小厂裁员不断,因岗位稀缺,匹配性,竞争大,被裁以后面临房贷、车贷等压力,不得不看下银行卡,还能够支撑多久,得赶紧地找下一家,但偏偏事与愿违,才发现找工作不容易。 特别还遇到一些奇葩或者不平等的现象:如去面试地点2h路途

    2024年02月08日
    浏览(45)
  • Android SeekBar使用避坑指南

    SeekBar是Android原生UI组件,可以用来调节进度,广泛应用于音乐、视频进度展示调控、音量、亮度调节等功能里。 SeekBar的使用很简单,这里就不再介绍了,本文着重介绍一下作者最近在使用SeekBar遇到的几个坑,希望大家以后可以避免。 如图,如何去实现这样一个可拖动进度

    2024年02月07日
    浏览(62)
  • AutoGPT 安装指南,使用避坑要点

    最近, AIGC 中最火的可能就当属于 AutoGPT 了吧,首先简单介绍一下AutoGPT 背景 AutoGPT 是基于 ChatGPT API 接口开发,项目首推 GPT-4 模型,但 OpenAI 账号 API 只有 gpt-3.5-turo 权限同样也可以使用。 项目在 github 上获取的 star 数从4 月初的 2k 到现在 60k,仅用了半个月 AutoGPT 之所以引起

    2024年02月05日
    浏览(53)
  • Android 14 刷机指南 & 避坑指导

    Android 14已经进入Beta阶段,提前布局的小伙伴,可以刷机适配了。 Android 14 Beta images are available for the following Google Pixel devices: Pixel 4a (5G) Pixel 5 and 5a Pixel 6 and 6 Pro Pixel 6a Pixel 7 and 7 Pro Android 14链接 一般Android 都是支持4代以内的设备,我手里之前有一台Pixel 4x,已经不满足需求,

    2024年02月10日
    浏览(54)
  • RabbitMq-发布确认高级(避坑指南版)

    在初学rabbitMq的时候,伙伴们肯定已经接触到了“发布确认”的概念,但是到了后期学习中,会接触到“springboot”中使用“发布确认”高级的概念。后者主要是解决什么问题呢?或者是什么样的场景引出这样的概念呢? 废话不说直接开始撸代码!!!在代码中解决实际问题

    2024年02月11日
    浏览(44)
  • 分布式性能测试避坑指南

    当进行分布式性能测试时,以下是一些避坑的指南: 1.定义明确的测试目标 在开始测试之前,确保清楚地定义测试的目标和需求。确定要测试的关键指标和阈值,以便能够准确评估系统的性能。 2.设计合适的测试场景 根据实际使用情况和预期负载,设计具有代表性的测试场

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包