WebSocket插件
;!(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插件的更多相关文章
- Jmeter websocket插件安装与使用
Jmeter websocket插件安装与使用 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试 ...
- Jmeter使用Websocket插件测试SingalR,外加还有阿里云PTS的Jmeter原生测试爬坑日志。
题外话:距离我的上一篇博客已经过去7年多了,我实在是个不务正业的程序员,遇到测试方面的东西总想分享一下,因为可用的资料实在太少了(包括国外的资料). 本人不喜欢授人以鱼,所以不会直接给出问题和解决方案 ...
- Jquery封装: WebSocket插件
1 $(function() { var websocket = null; //浏览器是否支持websocket if ("WebSocket" in window) { try ...
- sockjs+stomp的websocket插件
/** * 依赖文件sockjs.js.stomp.js * */ ;!(function (window) { 'use strict' let WS = function () { //保存所有的 ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- [Openfire]使用WebSocket建立Openfire的客户端
近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容.找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现.Op ...
- vue各种插件汇总
https://blog.csdn.net/wh8_2011/article/details/80497620(copy) Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一 ...
- VUE插件大总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...
- vue插件大全汇总
Vue是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件特别整理了常用的vue插件,来了个大汇总,方便查找使用,便于工作 ...
随机推荐
- vc++中代码段的免杀
一.文件特征码定位: 一般我们先用MyCCL把被查杀文件的文件特征码定位出来,然后用C32判断定位出来的这个特征码是代码还 是字符串,或者是输入表.输出表.版权信息等…定位在不同的地方,就要用不同的方 ...
- python列表与集合,以及循环时的注意事项
一.python列表 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,往后数的最后一个为-1依此类推. Python有6个序 ...
- springboot security+redis+jwt+验证码 登录验证
概述 基于jwt的token认证方案 验证码 框架的搭建,可以自己根据网上搭建,或者看我博客springboot相关的博客,这边就不做介绍了.验证码生成可以利用Java第三方组件,引入 <dep ...
- vue-property-decorator用法
vue-property-decorator这个库完全依赖于vue-class-component,所以在使用这个库之前请先阅读它, 不管啥反正都是装饰器而已 vue-property-decorat ...
- Mybatis总结之如何自动生成数据库表结构
一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...
- NetworkManager网络通讯_NetworkLobbyManager(三)
此部分可以先建立游戏大厅,然后进入游戏,此处坑甚多耗费大量时间.国内百度出来的基本没靠谱的,一些专栏作家大V也不过是基本翻译了一下用户手册(坑啊),只能通过看youtube视频以及不停的翻阅用户手册解 ...
- 如何用好redis pipeline
编者注:pipeline是Redis的一个提高吞吐量的机制,适用于多key读写场景,比如同时读取多个key的value,或者更新多个key的value.工作过程中发现挺多小伙伴都对pipeline多少 ...
- zabbix导入数据库报错1046 (3D000) : No database selected
Zabbix导入数据库时报错 使用如下命令导入Zabbix数据库时报错 zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -u ...
- C语言I作业06
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9888 我在 ...
- 学习笔记64_k邻近算法
1 .假定已知数据的各个属性值,以及其类型,例如: 电影名称 打斗镜头 接吻镜头 电影类别 m1 3 104 爱情片 m2 2 100 爱情片 m3 1 81 爱情片 m4 2 90 爱情片 w1 1 ...