关于websocket屎山,总是不自主的想改造下

2,025 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

废话只说一句:码字不易求个👍,收藏 === 学会,快行动起来吧!🙇‍🙇‍🙇‍。

感谢点赞、收藏、关注和提出建议的小伙伴,希望大家工作顺利、老板能给你们加鸡腿!

为回馈掘金的小伙伴们,特地做了个文档站点,将前端知识及日常封装的工具类系统的整理在该站点上,希望能帮到更多的小伙伴☞传送门

进入今天的正题,因为项目上要重新搭建基础的开发环境,项目中也涉及到了 websocket,但是面对强耦合和屎山,不由得吓得我一哆嗦,伸手不是,下脚也不是,整个人都懵了,殊不知我是被自己的无知整懵的,还是真的就被吓到了!也许找个跳大神的给叫叫魂就能好起来的。

无图无真相,念个咒语,祭出神图,'唵嘛呢叭咪吽,般若波罗蜜多,急急如律令!'

image.png

哎,怎么有点熟悉呐,明眼人一看就知道,这不就是 Vuex 嘛,对,没错,就是将这一大坨,还有里面的提示处理逻辑都写在了这里,我知道本意上也没啥坏心思,就是想通过全局方法方便控制和调用。但是好歹也简单封装下,减少些代码量,降低系统的耦合性。

话不多说,还是上代码...

采用的是 sockjs-clientstompjs,封装了 初始化、建立连接、断开连接三个方法。

import SockJS from  'sockjs-client/dist/sockjs.min.js';
import Stomp from "stompjs";

class WebSocket {

    /**
     * @description: 构造函数
     */
    constructor(url, subscribeUrl) {
        //公有属性和方法
        this.url = url;
        this.subscribeUrl = subscribeUrl;
        this.headers = {};
    }

    // 初始化
    initSocket(headers,cb) {
        this.headers = headers;
        this.cb = cb;
        this.connection();
        const self = this;
        // 断开重连机制,尝试发送消息,捕获异常发生时重连
        this.timer = setInterval(() => {
            try {
                console.log(1111)
                self.stompClient.send("test");
            } catch (err) {
                console.log("断线了: " + err);
                this.connection();
            }
        }, 2000);
        return this.stompClient;
    }
    // 建立连接
    connection() {
        const self = this;
        // 建立连接对象(还未发起连接)
        const socket = new SockJS(this.url);//连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
        // 获取STOMP子协议的客户端对象
        this.stompClient = Stomp.over(socket);
        // 向服务器发起websocket连接并发送CONNECT帧
        this.stompClient.connect(
            this.headers, //可添加客户端的认证信息 按需求配置
            (frame) => { //连接成功地回调函数
            this.cb('connect',{
                message: "消息中心已连接",
                data: frame
            })
            // 订阅频道
            self.stompClient.subscribe(this.subscribeUrl,
                (msg)=>this.cb('subscribe',msg) // 订阅服务端提供的某个topic
            );
            // self.stompClient.subscribe('/user/' + infoId + '/person/msg', (msg) => {
            //     console.log('收到消息:',msg.body);  // msg.body存放的是服务端发送给我们的信息
            // });
        }, (err) => {
            // 连接发生错误时的处理函数 失败调用
            this.cb('connect',{
                message: "消息中心连接失败",
                data: err
            })
        });
    }
    // 断开连接
    disconnect() {
        if (this.stompClient != null) {
            this.stompClient.disconnect();
            clearInterval(this.timer);
            this.cb('disconnect',{
                message: "消息中心已断开"
            })
        }
    }
}

export default WebSocket;

总结:

websocket 的实现客户端看起来比较简单,但是需要与后台进行很好的配合和调试才能达到最佳效果。通过SockJS、Stomp来进行浏览器兼容,增加消息语义,增强了可用性。要彻底搞懂websocket,我们还需要深入了解一些底层的原理以及相关的知识。

今天就暂且先这样,明天处理下使用实例,继续更新...