;!(function(window){
    "use strict";    

    let Event = {
        wsMesEvent:function(message){
            console.log(message)
        }
    }

    ,dftOpt = {
        protocol:(window.location.protocol == 'http:') ? 'ws://' : 'wss://'
        ,host:window.location.host
        ,port:'80'
        ,path:''
        ,isReConect:false
        ,wsMesEvent:Event.wsMesEvent
    }

    ,Util = {
        arrayLike(arrayLike){ Array.from(arrayLike)}
        ,isArray(arr){Array.isArray(arr)}
        ,forEach(array,iterate){
            let index = -1
            ,length = array.length;
            if(typeof iterate != 'function'){return array;}
            while (++index < length) {
                iterate.call(array,array[index], index);
            }
        }
        ,isPlainObject(obj){
            let flag = false;
            if(!obj || typeof obj != 'object'){return flag;}
            if(obj.constructor.prototype.hasOwnProperty("isPrototypeOf")){
                flag = true;
            }
            return flag;
        }
        ,extend(...args){
            if(args.length <= 0){return};
            let target = args[0];
            if(args.length == 1){return args[0]};
            this.forEach(args,(arg,i) => {
                if(i!=0){
                    var keys = Object.keys(arg);
                    this.forEach(keys,(key,i) => {
                        var val = arg[key];
                        if(this.isPlainObject(val) || this.isArray(val)){
                            var newTarget = this.isArray(val)?[]:{};
                            target[key] = this.extend(newTarget,val);
                        }else{
                            target[key] = val;
                        }
                    });
                }
            });
            return target;
        }
    }

    ,Ws = function (opt) {
        //如果浏览器不支持websocket,直接退出
        if(!this.isSupportWs()){
            alert("对不起,您的浏览器在不支持WebSocket,请先升级您的浏览器!!");
            return;
        }

        let config = this.config = Util.extend({},dftOpt,opt);

        //接口地址url
        this.url = config.protocol + config.host +':'+config.port + config.path;
        //心跳状态  为false时不能执行操作 等待重连
        this.isHeartBeat = false ;
        //重连状态  避免不间断的重连操作
        this.isReconnect = config.isReConect;
        //发送的消息
        this.curSendMes = null;
        //响应的信息
        this.message = null;
        //创建webSocket
        this.ws;

        //初始化websocket
        this.initWs = function(){
            //创建WebSocket
            let ws = this.ws = new WebSocket(this.url);
            //Ws连接函数:服务器连接成功
            ws.onopen = (e) => {
                console.log(`与${this.config.host}:${this.config.port}${this.config.path}连接已建立...`)
                this.isHeartBeat = true;
                //发布事件
                this.send();
            };
            //Ws消息接收函数:服务器向前端推送消息时触发
            ws.onmessage = (e) => {
                //处理各种推送消
                this.message = e.data;
                config.wsMesEvent.apply(this,[e.data]);
            }
            //Ws异常事件:Ws报错后触发
            ws.onerror = (e) => {
               this.isHeartBeat = false;
               this.reConnect();
            }
            //Ws关闭事件:Ws连接关闭后触发
            ws.onclose = (e) => {
                console.log('连接已关闭...');
                this.isHeartBeat = false;
                ws = null;
                this.reConnect();
            };
        };
        this.initWs();
    };

    //判断是否支持WebSocket
    Ws.prototype.isSupportWs = function(){
        return (window.WebSocket || window.MozWebSocket)?true:false;
    }

    //重新连接
    Ws.prototype.reConnect = function () {
        //不需要重新连接,直接返回
        if(!this.isReconnect) return;
        this.isReconnect = true;
        //没连接上 会一直重连,设置延迟避免请求过多
        setTimeout(()=>{
            this.initWs()
            this.isReconnect = false;
          }, 5000);
    }

    //发送消息
    Ws.prototype.send = function(content){
        this.curSendMes = content || this.curSendMes;
        if(this.isHeartBeat){
            this.ws.send(this.curSendMes);
        }
    }

    window.Ws = Ws;

})(window);

/***
 * 使用方式:
 * //建立连接
 * var ws1 = new Ws({
 *        host:'123.207.167.163'
 *        ,port:9010
 *        ,path:'/ajaxchattest'
 *        ,wsMesEvent:function(message){
 *            console.log(message)
 *        }
 *    });
 *    //发送请求
 *    ws1.send("111");
 *
 *    //建立连接
 *    var ws2 = new Ws({
 *        host:'123.207.167.163'
 *        ,port:9010
 *        ,path:'/ajaxchattest'
 *        ,wsMesEvent:function(message){
 *            console.log(message)
 *        }
 *    });
 *    //发送请求
 *    ws2.send("222");
 * */

WebSocket插件的更多相关文章

  1. Jmeter websocket插件安装与使用

    Jmeter websocket插件安装与使用 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试 ...

  2. Jmeter使用Websocket插件测试SingalR,外加还有阿里云PTS的Jmeter原生测试爬坑日志。

    题外话:距离我的上一篇博客已经过去7年多了,我实在是个不务正业的程序员,遇到测试方面的东西总想分享一下,因为可用的资料实在太少了(包括国外的资料). 本人不喜欢授人以鱼,所以不会直接给出问题和解决方案 ...

  3. Jquery封装: WebSocket插件

    1 $(function() { var websocket = null; //浏览器是否支持websocket if ("WebSocket" in window) { try ...

  4. sockjs+stomp的websocket插件

    /** * 依赖文件sockjs.js.stomp.js * */ ;!(function (window) { 'use strict' let WS = function () { //保存所有的 ...

  5. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  6. [Openfire]使用WebSocket建立Openfire的客户端

    近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容.找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现.Op ...

  7. vue各种插件汇总

    https://blog.csdn.net/wh8_2011/article/details/80497620(copy) Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一 ...

  8. VUE插件大总结

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  9. vue插件大全汇总

    Vue是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件特别整理了常用的vue插件,来了个大汇总,方便查找使用,便于工作 ...

随机推荐

  1. MyBatis 概念

    简介 什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyB ...

  2. The usage of Markdown---表格

    更新时间:2019.09.14   谈到怎么在Markdown中插入表格,其实只要熟知以下几点就可以了: 使用管道符|进行内容的分割 使用冒号:和连号符-表示表格内容的对齐情况,连号符-在中间,冒号: ...

  3. js数据交互——fetch

    什么是fetch? Fetch被称为下一代Ajax技术,采用Promise方式来处理数据. 是一种简洁明了的API,比XMLHttpRequest更加简单易用.fetch是原生的(无需引入任何库和框架 ...

  4. 2018.8.6 Python中的文件操作

    前言: 使用python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄.然后通过文件句柄就可以进行各种操作了,根据打开方式的不同能够执行的操作也会有相应的差异. 打 ...

  5. git push 报src refspec xxx does not match any的错误

    今天在向一个新的远程分支上推送项目的时候报错: 远程分支branch_new是其他人建的,我在自己本地修改后把自己分支的修改推送到这个远程分支上. 把修改提到本地仓库: git add ./ git ...

  6. swift 实现 iOS摇一摇

    本博客包含了如何实现iOS摇一摇全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBShake ,支持swift3.0+. 一.导包 项目主要使 ...

  7. Nexus 离线更新中央仓库索引

    nexus可以在线更新中央仓库索引,但是更新速度慢,而且很有可能下载的索引不全.下面介绍一种离线更新中央仓库索引的方式,速度快并且可靠. 1.访问http://repo.maven.apache.or ...

  8. Tesseract引擎编译

    1. 工具包下载链接 libtiff 4.09 http://download.osgeo.org/libtiff/tiff-4.0.9.zip leptonica 1.76.0 http://www ...

  9. gym102302E_Chi's performance

    题意 给n个二元组(v,p),要求排序使得v从小到大,而且总价值最大,价值定义为相邻两个v值不同的p值之差绝对值之和. 分析 in a row原来是相邻的意思. 对于每个相同v值的块来说,有用的数只有 ...

  10. 【Java必修课】String.intern()原来还能这么用(原理与应用)

    1 简介 String.intern()是JDK一早就提供的native方法,不由Java实现,而是底层JVM实现,这让我们对它的窥探提高了难度.特别是在Oracle收购了Sun公司后,源代码不开源了 ...