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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> websoket封装版 参数配置化 开箱即用 -> 正文阅读

[网络协议]websoket封装版 参数配置化 开箱即用

插播:

遇到很闹心的一件事,之前就写好了一篇关于分享一款在线ps的软件,无奈一直审核不通过,说是打广告。我修改了多次,还是通不过,好吧,需要的可以加群获取吧。

进入正题:

最近在做项目的时候自己封装了websoket,简单的实现了消息的接收和发送,断线重连、心跳检测等功能。

做之前在网上找了一些相关资料,并没有找到完整的代码,都只是只言片语,不是我想要的,于是对websoket进行了封装,相对而言还是比较完整,那就分享给大家吧。

话不多说,直接上代码~

websoket.js:

var websoket = {
	create: function(url, o) {
		this.hasWebsoket = window.WebSocket && window.WebSocket.prototype.send; //是否支持websoket
		this.connectUrl = url; //连接地址
		this.socketTask = null; //websoket对象
		this.resure = o && o.resure == false ? o.resure : true; // 断开后是否允许重连
		this.relocal = false; // 重连开关
		this.retimer = 0; // 重连定时器id
		this.retimeout = o && o.retimeout ? o.retimeout : 1000 * 5; // 重连间隔时间
		this.renum = 0; // 重连次数
		this.remax = o && o.remax ? o.remax : -1; // 最大重连次数 -1代表无限制
		this.checkcont = o && o.checkcont == false ? o.checkcont : true; // 是否开启心跳检测
		this.checkcontimer = 0; //心跳定时器id
		this.checkcontimeout = o && o.checkcontimeout ? o.checkcontimeout : 1000 * 15; //心跳间隔时间
		this.debug = o && o.debug ? o.debug : false;
		this.connecting = false; //是否在连接中...
		this.isopen = false; //是否打开状态
		return this;
	},
	// 打印日志
	log: function(msg, res) {
		if (this.debug) {
			if (res) console.log(msg, res);
			else console.log(msg);
		}
	},
	// 打开websoket
	open: function() {
		this.close();
		this.initwebsoket();
	},
	// 初始化websoket
	initwebsoket: function() {
		var that = this;
		// 判断状态是否进行连接websoket
		if (this.connecting || this.isopen) return false;
		this.connecting = true;
		this.isopen = false;
		if (this.hasWebsoket) { //支持websoket
			// this.url = (this.url.slice(0, 5) === 'https') ? 'wss' + this.url.slice(5) : 'ws' + this.url.slice(4);
			this.socketTask = new WebSocket(this.connectUrl);
			if (this.socketTask) this.connecting = false;
			this.socketTask.onopen = function() {
				that.log('---websoket连接成功---');
				that.isopen = true;
				that.renum = 0;
				that.resure = true;
				that.onconsuccess();
				that.checkconnect();
			}
			this.socketTask.onmessage = function(res) {
				that.getMessage(res);
				that.checkconnect();
			}
			this.socketTask.onerror = function(error) {
				that.log('---websoket进入onerror回调,表示连接失败---:', error);
				that.isopen = false;
				that.socketTask = null;
				that.reconnect();
			}
			this.socketTask.onclose = function() {
				that.log('---websoket进入onclose回调,表示已关闭---');
				that.isopen = false;
				that.socketTask = null;
				that.reconnect();
				that.onclose();
			}
		} else { //不支持websoket
			console.warn('浏览器版本过低,不支持websoket');
		}
	},
	// 连接成功回调
	onconsuccess: function() {},
	// 关闭websoket
	close: function() {
		if (!this.socketTask) return false;
		this.socketTask.close();
		this.socketTask = null;
		this.resure = false;
		this.clear();
	},
	// 关闭回调
	onclose: function() {},
	// 发送消息
	send: function(msg) {
		if (!this.isopen) return this.log('请先调用 open() 开启网络');
		this.socketTask.send(JSON.stringify(msg));
	},
	// 处理收到的消息
	getMessage: function(res) {
		try {
			var resultObj = JSON.parse(res.data);
			this.log('---接收到的消息---:', resultObj);
			this.onmessage(resultObj);
		} catch (e) {
			console.error('返回数据出现异常', e);
			this.onmessage(res);
		}
	},
	// 接受消息回调
	onmessage: function(data) {},
	// 重连
	reconnect: function() {
		var that = this;
		if (this.relocal || !this.resure) return false;
		this.relocal = true;
		this.log('开始重连...');
		this.clear();
		this.renum++;
		if (this.remax > -1 && this.renum >= this.remax) return false;
		this.retimer = setTimeout(function() {
			that.initwebsoket();
			that.relocal = false;
		}, this.retimeout)
	},
	// 心跳检测
	checkconnect: function() {
		var that = this;
		if (!that.socketTask || !this.checkcont) return false;
		this.clear();
		this.checkcontimer = setInterval(function() {
			that.log('心跳检测...');
			that.socketTask.send('HeartBeat');
		}, this.checkcontimeout);
	},
	// 清除
	clear: function() {
		this.checkcontimer && clearInterval(this.checkcontimer);
		this.retimer && clearTimeout(this.retimer);
	}
}

使用方法:

<script type="text/javascript" src="websoket.js"></script>
var WebSoket = websoket.create('ws://192.168.0.212:5200', { debug: true });
WebSoket.open();
// 连接成功
WebSoket.onconsuccess = function () {
    console.log('连接成功的后续操作')
}
// 收到消息监听
WebSoket.onmessage = function (res) {
    console.log('收到消息',res)
}
// 关闭监听
WebSoket.onclose = function () {
    console.log('关闭了')
}

参数说明:

参数名类型说明是否必传默认值备注
urlString连接websoket地址ws类似于http,wss类似于https
o.debugBoolean调试模式false是否开启调试模式
o.resureBoolean断开重连true是否允许断开重连
o.retimeoutNumber断开重连间隔时间1000 * 8(秒)
o.remaxNumber最大重连次数-1(无限制)
o.checkcontBoolean心跳检测true是否开启心跳检测
o.checkcontimeoutNumber心跳间隔时间1000 * 15(秒)心跳检测间隔时间

注意:

1、 该插件只支持ie10及以上的版本,因为websoket只支持ie10及以上的版本。
2、 该插件只支持H5页面。


如果有帮助,可以点赞+收藏+关注,后续有更多知识与您分享!!!

欢迎加入QQ技术群:568984539,加群备注‘地区-名字-技术类型’,以防乱加。

关于本文,如果任何疑问的可以在评论区留言,我看到就会第一时间回复的。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:15:05  更:2022-04-22 19:16:39 
 
开发: 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/26 3:26:19-

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