精华内容
下载资源
问答
  • I don't care too much about the WebSocket connections I only care about the normal requests being served before shutting down the old server and firing up the new updated compiled file that will ...
  • 2、需要区分主动关闭还是被动关闭websocket,如页面隐藏主动关闭不需要重连,还是触发websocket error需要重连 ws.js export default { /** * * @param {String} url wwbsocket地址 * ...

    由于个人开发环境是vue,就从vue入手

    注意点:

    1、心跳监测需要在websocket关闭的时候及时关闭,避免定时器累计
    2、需要区分主动关闭还是被动关闭websocket,如页面隐藏主动关闭不需要重连,还是触发websocket error需要重连

    ws.js
    export default {
    	/**
    	 * 
    	 * @param {String} url wwbsocket地址
    	 * @param {*} th //vue的this
    	 */
    	async wsOpen(url,_this) {
    	    let ws = new WebSocket(url);
    	    ws.onopen = function(evt) {
    	    	//心跳监测定时器,定义为对象,是为了防止一个组件多个定时器,调用wsOpen导致定时器被覆盖,就始终有定时器未被正常关闭
    	        _this.testWeb = _this.testWeb || {}	
    	        //每隔10秒钟发送一次心跳,避免websocket连接因超时而自动断开 
    	        _this.testWeb[url] = setInterval(function(){ 
    	        	/**
    	        	*	readyState
    	        	*	0: connecting	正在连接
    	        	*	1:open		连接开启
    	        	*	2:closing		正在关闭
    	        	*	3:closed		关闭成功,触发onclose
    	        	*/
    	        	//虽然心跳会在触发close/error时被关闭,
    	        	//但是其关闭时间并不短暂也就是其在关闭中定时器不会调用onclose关闭心跳
    	        	//readyState=2持续发送心跳数据会导致控制台报错,所以我加了判断
    	            ws.readyState===1?ws.send('hello'):clearInterval(_this.testWeb[url]);
    	        },10 * 1000);
    	    };
    	    ws.onerror = error => {
    	        clearInterval(_this.testWeb[url]);
    	        console.log('websoket错误了');
    	        if(_this.reconnect){	//非正常关闭重连
    	            let timeouts = setTimeout(() => {
    	                _this.getData();//ws关闭后的回调函数
    	                clearTimeout(timeouts)
    	            },60*1000)
    	        }
    	    };
    	    ws.onclose = () => {
    	        clearInterval(_this.testWeb[url]);
    	        _this.testWeb = {};
    	        console.log('websoket关闭了');
    	        if(_this.reconnect && ws.readyState == 3){	//非正常关闭重连
    	            let timeouts = setTimeout(() => {
    	                _this.getData();//ws关闭后的回调函数
    	                clearTimeout(timeouts)
    	            },10*1000)
    	        }
    	    };
    	    return ws;
    	},
    }
    
    vue组件中

    可以考虑将reconnect存储到store里面,但若是多个websocket,只有一个发生错误,能精准到某一个websocket重启而不是全部重启。

    import common from '@/assets/js/ws.js'
    
    export default {
        data(){
            return{
                reconnect: true,	//是否需要重连
            }
        },
        methods:{
            getData(){	//获取数据
                if(!this.reconnect){
                    return;
                }
                common.wsOpen.call(this,`${this.$socket}/ws`,this).then(res => {
                    this.ws = res;
                    this.ws.onmessage = evt => {
                        let resData = JSON.parse(evt.data);
                        if(resData.code==1){
                            //数据处理
                        }
                        
                    }
                })
            },
            visibilitychange(e){	//检测页面状态
                if(document.visibilityState == 'hidden'){	//页面隐藏
                    this.reconnect = false;
                    this.ws.close();
                }else{	//页面显示
                    this.reconnect = true;
                    this.getData();
                }
            }
        },
        created(){
        },
        mounted(){
            this.getData();
            window.addEventListener('visibilitychange',this.visibilitychange)
        },
        beforeDestroy() {
            this.reconnect = false;
            this.ws.close();
            window.removeEventListener("visibilitychange",this.visibilitychange)
        },
    
    展开全文
  • 后端服务器宕机或重启时,前端Vue 不断重连webSocket的解决办法: 问题重现:后台服务重启时,前端连接的webScoket就断了,需要刷新页面才能重新建立连接,这样用户体验的效果不好,而且有些业务场景,比如硬件监控...

    问题重现:

    后台服务重启时,前端连接的webScoket就断了,需要刷新页面才能重新建立连接,这样用户体验的效果不好,而且有些业务场景,比如硬件监控系统大屏这些是不允许刷新页面的,所以需要前端发现webSocket断了,然后自己不断去发起连接。


    解决思路:

    在webSocket的生命周期onclose和onerror时调用重连函数,增加心跳检测。


    解决方案:

    1. 创建变量
      data() {
          return {
              // webSocket对象
      		webSocket: null,
      		// webSocketUrl地址
      		webSocketUrl: null,
      		//连接标识 避免重复连接
      		isConnect: false,
      		//断线重连后,延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
      		rec: null,
      		// 心跳发送/返回的信息
      		checkMsg: {hhh: 'heartbeat'},
      		//每段时间发送一次心跳包 这里设置为20s
      		timeout: 20000,
      		//延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
      		timeoutObj: null,
          }
      }

       

    2. 创建webSocket连接
      //创建webSocket连接
      createWebSocket() {
          let that = this;
      	that.webSocket = new WebSocket(that.webSocketUrl);
      	that.initWebsocket();
      }

       

    3. 初始化webSocket连接

      initWebsocket() {
          let that = this;
      	//WebSocket连接建立之后会调用onopen方法
      	that.webSocket.onopen = that.websocketonopen;
      	//当websocket收到服务器发送的信息之后  会调用onmessage方法 
      	that.webSocket.onmessage = that.websocketonmessage;
      	//当websocket因为各种原因(正常或者异常)关闭之后,会调用onclose方法
      	that.webSocket.onclose = that.websocketclose;
      	//当websocket因为异常原因(比如服务器部署、断网等)关闭之后,会调用onerror方法
      	//在onerror中需要调用reConnect方法重连服务器
      	that.webSocket.onerror = that.websocketonerror;
      }

       

    4. websocketonopen函数

      websocketonopen() {
      	let that = this;
      	console.log('open');
      	//连接建立后修改标识
      	that.isConnect = true;
      	// 建立连接后开始心跳
      	// 因为nginx一般会设置例如60s没有传输数据就断开连接  所以要定时发送数据
      	that.timeoutObj = setTimeout(function() {
      		if (that.isConnect) {
      		    that.webSocket.send(that.checkMsg);
              }
          }, that.timeout);
      }

       

    5. websocketonerror函数

      websocketonerror() {
      	let that = this;
      	console.log('error');
      	//连接断开后修改标识
      	that.isConnect = false;
      	//连接错误 需要重连
      	that.reConnect();
      }

       

    6. websocketonmessage函数

      websocketonmessage(e) {
          // 拿到数据,处理自己的业务
      	let that = this;
      	console.log(e.data);
      				
      	//获取消息后 重置心跳
      	clearTimeout(that.timeoutObj);
      	that.timeoutObj = setTimeout(function() {
      	    if (that.isConnect) {
      		    that.webSocket.send(that.checkMsg); 
              }
      	}, that.timeout);
      }

       

    7. websocketclose函数

      websocketclose() {
          let that = this;
      	console.log('close');
      	//连接断开后修改标识
      	that.isConnect = false;
      	//连接错误 需要重连
      	that.reConnect();
      }

       

    8. 定义重连函数

      reConnect() {
          let that = this;
      	console.log('尝试重新连接');
      	//如果已经连上就不在重连了
      	if (that.isConnect) {
      		return;
      	}
      	clearTimeout(that.rec);
      	// 延迟5秒重连  避免过多次过频繁请求重连
      	that.rec = setTimeout(function() {
      		that.createWebSocket();
      	}, 5000);
      }

       

     

    展开全文
  • websocket链接,为实现断网、服务器重启等特殊情况。 原理 每隔一段时间向服务器发送一次数据 即(heartCheck.start()),服务器接收数据后返回一次信息,用来证明一切正常,否则就开始启动新的定时器来尝试重新连接...

    背景
    websocket链接,为实现断网、服务器重启等特殊情况。

    原理
    每隔一段时间向服务器发送一次数据 即(heartCheck.start()),服务器接收数据后返回一次信息,用来证明一切正常,否则就开始启动新的定时器来尝试重新连接(websocketReconnect()一定的时间尝试重连,如此重复)。

    代码

    var lockReconnect = false;//避免重复连接
    var wsUrl = "wss://echo.websocket.org";		// websocket链接
    var ws;
    
    function createWebSocket(){
    	try {
    		ws = new WebSocket(wsUrl);
    		websocketInit();
    	} catch (e) {
    		console.log('catch');
    		websocketReconnect(wsUrl);
    	}
    }
    
    createWebSocket();			// 创建websocket
    
    function websocketInit () {
    	// 建立 web socket 连接成功触发事件
    	ws.onopen = function (evt) {
    		onOpen(evt);
    	};
    	// 断开 web socket 连接成功触发事件
    	ws.onclose = function (evt) {			
    		websocketReconnect(wsUrl);
    		onClose(evt);
    	};
    	// 接收服务端数据时触发事件
    	ws.onmessage = function (evt) {
    		onMessage(evt);
    	};
    	// 通信发生错误时触发
    	ws.onerror = function (evt) {
    		websocketReconnect(wsUrl);
    		onError(evt);
    	};
    };
    
    function onOpen(evt) {
    	console.log("建立链接");
    	var sendData = { test: 'test' };        // 正常的请求数据
    	sendData = JSON.stringify(sendData);
    	ws.send(sendData);
    	//心跳检测重置
    	heartCheck.start();
    }
    
    function onClose(evt) {
    	console.log("连接已关闭...");
    }
    
    function onMessage(evt) {
    	console.log('接收消息: ' + evt.data);
    	var data = JSON.parse(evt.data);
    	if (data.test && data.test =='hello') {		// 对后端传过来的数据正常处理
            // 所需的正常操作
        }
    	//拿到任何消息都说明当前连接是正常的
    	heartCheck.start();
    }
    
    function websocketReconnect(url) {
    	if (lockReconnect) {       // 是否已经执行重连
    		return;
    	};
    	lockReconnect = true;
    	//没连接上会一直重连,设置延迟避免请求过多
    	tt && clearTimeout(tt);
    	var tt = setTimeout(function () {
    		createWebSocket(url);
    		lockReconnect = false;
    	}, 5000);
    }
    
    //心跳检测
    var heartCheck = {
    	timeout: 30000,
    	timeoutObj: null,
    	serverTimeoutObj: null,
    	start: function () {
    		console.log('start');
    		var self = this;
    		this.timeoutObj && clearTimeout(this.timeoutObj);
    		this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
    		this.timeoutObj = setTimeout(function () {
    			//发送测试信息,后端收到后,返回一个消息,
    			ws.send("1");
    			self.serverTimeoutObj = setTimeout(function () {
    				ws.close();
    			}, self.timeout);
    		}, this.timeout)
    	}
    }
    
    function onError(evt) {
    	console.log('通信错误:' + evt.data);
    } 
    

    原文链接:https://www.cnblogs.com/tugenhua0707/p/8648044.html
    在实际运用中对原文进行一定修改。

    展开全文
  • <p>I am using the ratchet websocket server on CentOs. The problem is it is stopped after some time. I have used the screen command to solve the problem but when server is rebooted it does not start ...
  • 会出现Worker崩溃重启现象。<code>memory_usage结果没有大的波动 <h3>Steps To Reproduce: <p><code>WebSocket控制器:<code>App\Controller\WebSocket\IndexController内容如下 <pre><code> class IndexController ...
  • JMeter压测Websocket插件

    2018-10-24 09:59:23
    使用JMeter压测Websocket协议,需要下载Websocket插件。...io-9.4.12.v20180830.jar等),解压后拷贝到JMeter的安装目录下的..\apache-jmeter-3.1\lib\ext路径下,重启JMeter,即可简历Websocket的长连接和请求。
  • jmeter websocket依赖包

    2018-06-05 07:52:13
    jmeter websocket依赖包。直接把所有jar包拷贝到jmeter文件夹的lib/ext下,重启jmeter即可。
  • JMeter-websocket

    2020-07-22 11:23:49
    安装:下载后文件为plugins-manager.jar格式,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动jmeter,点击选项,最下面的一栏,如下图所示: PS:一般不建议进行更新操作,因为最新的插件都...

    JMeter-websocket

    首先我想说说jmeter插件相关的东西

    JMeter插件

    1.下载插件管理器
    下载地址:jmeter-plugins.org
    安装:下载后文件为plugins-manager.jar格式,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。
    启动jmeter,点击选项,最下面的一栏,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    PS:一般不建议进行更新操作,因为最新的插件都有一些兼容问题,而且很可能导致jmeter无法使用(经常报加载类异常)!!!

    压测websocket

    首先通过以上步骤下载websocket插件,下载完成,相关的jar包(除了websocket的jar还有相关的依赖包)也会保存在lib/ext下。
    目前插件里面有这两个websocket插件,我也是第一次用,一开始下载的websocket samplers by peter doornbosch但压测的过程没法保持长连接(资料说勾选streaming connection可保持长连接,但没生效);之后下载的websocket samplers by maciej zaleski。
    在这里插入图片描述
    我不知道它们具体有什么不一样,从使用上来看。Peter Doornbosch只有websocket sampler这个取样器,而maciej zaleski 则有
    websocket open connection、 websocket request-response sampler、 websocket close等等,可以按需选择。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 但一段时间后项目中有了新的需求,想要实现消息主动推到客户端的功能 ,单从功能上来看可以采用springboot自带的websocket实现,但开发过程遇到很奇怪的报错,报错信息如下 {"time":"2019-09-27 11:07:22 626", ...
  • JMeter websocket接口测试

    千次阅读 2020-07-17 10:33:34
    jetty-http jetty-io jetty-util websocket-api websocket-client websocket-common 相关依赖下载: ...提取码:uq25 将相关jar包放入JMeter安装目录的/lib/etc中,重启JMeter。 页面内填写: ...
  • php 启动websocket

    2020-07-07 17:49:11
    Websocke_test使用说明 首先先修改conversation.php与... ...” ,重启php环境。 本地cmd启动websocket服务,通过命令行执行 [php路径]php.exe “[文件路径]server.php” 浏览器打开conversation.html,发送连接请求。
  • websocket 心跳连接

    2019-12-19 08:19:58
    websocket连接时,如果长时间没有进行数据的通讯就会自动断开连接。为了不让其断开就在要断开的时候自动发送数据进行通讯,就产生了心跳连接的效果。 具体的操作就是在客户端建立连接的时候开启发送心跳信息的线程...
  • Jmeter WebSocket补丁

    2019-05-05 15:25:54
    jmeter添加webscoket的补丁,下载该资源后,将资源中的jar包拷贝至\jmeter\lib\ext\目录下,然后重启jmeter
  • Jmeter默认不支持websocket连接,于是需要下载一个插件叫做JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar,这个插件需要下载6个依赖包,需要下载额外的jar包到jmeter目录的\lib\ext\目录下,重启一下JMeter 出现如下图...
  • JMeter websocket依赖的jar包: JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar ...以上jar包都准备好并放到Jmeter目录的\lib\ext\目录下后,重启Jmeter之后可以在sampler中看到websocket sampler这一项
  • WebSocket服务挂掉问题记录

    千次阅读 2019-05-22 03:20:58
    一、背景 之前使用websocket服务为H5页面进行实时数据推送,突然有一天产品给我反馈,说该页面...当天接到反馈后,我看了下服务,监控程序是正常的,会对websocket进行重启,但每次重启过后不超过30s,websocket的m...
  • Jmeter对websocket压测

    2019-01-29 00:15:12
    一、对websocket进压测需要引入Jdk环境1.8版本以上。 二、引入6个依赖的jar包:由于Jmeter本身不支持websocket...然后重启Jmeter,重启:进入bin目录,双击jmeter.bat 下载插件的地址:https://jmeter-plugins.org...
  • 2.将jar包放入 jmeter的 lib/ext目录,重启jmeter 二、安装WebSocket插件 2.1 选项 - Plugins Manager 三、配置测试用例 3.1 新建线程组-然后在线程组右键-添加 - 取样器 - Websocket Sampler 不知如何...
  • jmeter之websocket压测

    2020-07-13 18:41:38
    二、重启 JMeter 注意:在jmeter下载配置压测博客中我讲述了可以任意目录启动jmeter的配置。 sh jmeter 启动图标为: 但是此种启动方式看到的插件是这种: 所有建议在 jmeter的 bin目录下启动: 启动成功图标:...
  • 包含Jmeter组件: 1. jmeter-websocket-samplers.jar 2. websocket-common.jar 3. websocket-client.jar 4. websocket-api.jar 5. jetty-util.jar ...解压后全部放到/lib/ext目录下,并重启Jmeter。
  • 发包大小超出范围找到项目中web.xml文件,加入如下配置重启服务即可。 <!-- websocket 发送内容长度设置(默认8192字节) --> <param-name>org.apache.tomcat.websocket.textBufferSize <param-value>5242800 ...
  • 服务启动后,浏览器发起websocket连接,这个正常;但是我把tomcat重复后,控制台输出: ``` 2016-09-18 16:50:46,246 [http-bio-8080-exec-1] ERROR [500.jsp] - Uncaught failure for request ...
  • 首先我在服务器上开放8500端口,把gatewayworker websocket和tp框架配置好,使用守护进程方式运行起来。开发到一半,想看看php start.php start报错,因为这个程序有时候可以正常运行,有时候运行不下去。然后我输入...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 195
精华内容 78
关键字:

websocket重启