最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • webscoket实时通信实现demo【node模拟服务端】

    正文概述 掘金(制杖)   2021-01-30   436

    开工前准备工作

    1.前后端约定好长链接的URL

    (本文举例:域名-127.0.0.1,端口号-8081,路径-/test)

    2.前后端约定好发送message指令的格式

    (本文格式为 {'userId':' ', 'message': ' '} )

    前端封装可保持长链接的websocket构造函数

    1.创建一个普通的websocket连接

    function createWebsocket(link) {
    	// 检查浏览器是否支持websocket
    	if (!('WebSocket' in window) && !('MozWebSocket' in window)) {
    		alert('浏览器暂不支持websocket');
    	} else {
    		var ws = new WebSocket(link);
    		initWs(); // 初始化websocket相关的事件监听
    	}
    }
    

    2.初始化websocket相关的事件监听

    function initWs() {
    	// 连接服务器成功触发
    	ws.onopen = function(e){
        	logStatus("连接服务器成功"); // 打印log工具函数
        	...// 自定义操作
        	// 开始心跳
        	heartSend.start();
       }
       // 接收服务器的消息触发
       ws.onmessage = function(e){
       
       	let message = "接收到一条服务端信息,message:"+e.data+"";
            logStatus(message);
       	 ...// 自定义操作
        	// 心跳计时器重启
       	heartSend.reset().start();
       }   
       // 连接关闭触发
       ws.onclose = function(e){
        	logStatus("连接关闭:" + e.code + e.reason);
        	heartSend.reset();// 停止心跳
       	 ...// 自定义操作
       }
       // 连接异常触发
       ws.onerror = function(e){
        	logStatus("连接出错,error:" + e.data);
        	logStatus("正在尝试重新连接");
        	heartSend.reset();// 停止心跳
        	...// 自定义操作
        	reconnect(url);
       }
       // 封装自定义关闭连接[举例]
       ws.closeForUse = function(bool){
           // 参数、控制逻辑可依据业务具体需要自行封装,这里bool仅仅举例实现自动断开重连功能
    	ws.close();
    	bool && logStatus("正在尝试重新连接");
    	bool && reconnect(url);
       }
       // 封装发送信息方法[同理举例,根据业务需要灵活封装即可]
       ws.sendForUse = function(clientId, msg, ...param){
    	let msg = {
    	   'clientId': clientId,
    	   'msg': msg,
    		...
    	 }
    	 ws.send(msg);
    	 logStatus('send: ' + msg);
       }
      
    }
    

    3.添加心跳机制[主动与服务端保持连接]

    事出有因:长时间无信息通信,服务端会自动断开连接,因此可添加心跳机制间隔一段时间像服务端发送消息,主动保持联络。

    var heartSend = {
    	timeout: 200000, // 自定义
    	timeObj: null,
    	reset: function(){
    		clearTimeOut(this.timeOutObj);
    	},
    	start: function(){
    		this.timeOutObj = setTimeOut(function(){
    			var msg = {'keepConnect': 'on'};
    			logStatus('发送心跳信息');
    			ws.send(msg);
    		}, this,timeout)
    	}
    }
    

    3.监听窗口关闭,处理异常

    window.onbeforeunload = function(){
    	ws.close(); // 关闭长连接
    }
    

    3.断开、连接异常 自动重连

    function reconnect (url) {
    	ws = null; // 清空上次的websocket
    	setTimeOut(function(){
    		createWebsocket(url)
    	}, 2000)
    }
    

    4.客户端代码示例

    export default function(domain) {
    	let ws = null;
    	let link = 'ws://' + domain + ':8081' + '/test';
    	let WsFunc = function() {
    		function createWebsocket(link) {...};
    		function initWs() {...};
    		var heartSend = {...};
    		function reconnect(link) {...};
    		createWebsocket(link); // 创建一个长连接
    		// 监听窗口关闭时间,窗口关闭,主动关闭websocket连接
    		window.onbeforeunload = function(){
    			ws.close(); // 关闭长连接
    		}
    
    		return ws;
    	}
    	let logStatus = function(msg) {
    		console.log(msg + '---' + new Date().toLocaleString());
    	}
    	window.top.wsObj = new WsFunc();
    }
    

    后端demo[简易]

    var ws = require("nodejs-websocket");
    var server = ws.createServer(function(obj){
      obj.on("text", function (str) {
        console.log("连接")
        obj.sendText("xxxx");
        ...
      })
      obj.on("close", function (code, reason) {
        console.log("关闭")
      });
      obj.on("error", function (code, reason) {
        console.log("异常")
      });
    }).listen(8001)
    

    起源地下载网 » webscoket实时通信实现demo【node模拟服务端】

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元