IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 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犯冲,一个是单例,一个是多例

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:34:57  更:2022-10-31 12:35:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:45:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码