• WebSocket 初体验


    其实老早就觊觎 Socket 这碗美食了,在 WebSocket 发出后更是心潮澎湃...

    奈何这需要后端同志的帮助,使得至今才得以品尝。(当然本文也只涉及前端部分)

    以前想监听其他设备变化,大屏幕交互,还有客服,多设备游戏等,

    用过轮询(特定的时间间隔请求一次),后来也受教使用长链接(后端实现链接 1s 内不断,断了再请求)

    但总要为性能这事捏一把汗,

    而 Socket/WebSocket 就是即时通信,就是能很好的完成上述需求呀,

    啊哈哈哈,不禁笑出了声音...

    好的,回归正题,先看封装代码

    function Socket(url, options) {
        var opt = $.extend({
            onopen: function(e){},
            whenGet: function(val){},
            onreset: function(){},
            beforeClose: function(){},
            onclose: function(){},  // (注:此处已不能再传输,为关闭后运行)
        }, options || {});
    
        var wsImpl = window.WebSocket || window.MozWebSocket;
        var socket = new wsImpl(url);
    
        // 关闭或刷新页面时,也关闭 socket
        var DispClose = true;
        $(window).on('beforeunload', CloseEvent);
        $(window).on('unload', UnLoadEvent);
        function _close() {
            opt.beforeClose.apply(this, arguments);
            socket.close();
        }
        function CloseEvent() {
            if (DispClose) return "是否离开当前页面?";
            _close();
        }
        function UnLoadEvent() {
            DispClose = false;
            _close();
        }
    
        // WebSocket 本身事件
        socket.onopen = function(){
            opt.onopen.apply(this, arguments);
        }
        socket.onclose = function(){
            opt.onclose.apply(this, arguments);
        }
        socket.onmessage = function(){
            opt.whenGet.apply(this, arguments);
        }
        socket.onerror = function(e){
            console.log(e);
        }
    
        // 外放的其他方法
        return {
            send: function(val) {
                socket.send(val);
            },
            reset: function(){
                socket = new wsImpl(url);
                opt.onreset.apply(this);
            },
            close: _close,
        };
    }
    

    演示地址: http://sum.kdcer.com/test/SocketGame/

    技术难点:

    1. 从后端那搞到 ws:// 格式的 url

    2. 处理好 whenGet 的传值,可以看看演示的源码,这个就看需求,相当考逻辑了

    但还有个小问题就是 socket 延时/主动断开的情况,beforeClose 就不运行了,也就不能传输告诉别人我挂了,这个很尴尬

    敲黑板,WebSocket 是个好东西,大家快用起来吧,一起研究哈

  • 相关阅读:
    第七周
    跳ajax方式进行前后台交互之后台代码要怎么写
    写代码要注意细节,无谓的找前台bug
    mysql复习增删改查
    jquery获取value值
    sql查阅每一月的数据
    登录模块需要用到session留底
    前后台使用ajax传list的时候,用value[] 获取值
    Datables wrning(table id='example'):Cannot reinitialise DataTable.
    动态规划1
  • 原文地址:https://www.cnblogs.com/foreverZ/p/6553611.html
Copyright © 2020-2023  润新知