webscoket请求是一种长链接,只需要对服务器连接一次,一直处于连接状态,只要对服务器一直发送信息,这种链接就不会断开;当然他断开的情况,是因为服务器长时间没有接受的消息,它就会自动判断服务应该断开了,一旦服务断开,是无法发送信息的。webscoket是一个双全工通道协议。他与轮询不一样,轮询是需要不断的请求服务器的,不断的给服务器请求连接。

webscoket服务请求

这张图应该可以更好的的解释轮询和长链接的差别啦,除了以上两者,还有一个叫着单向通道协议(sse),只能有服务器向web端发送信息,一直处于连接状态。

虽然这边博文介绍的不是特别详尽,但也是我们学习的一手资料。先这样把,我们写代码,再解释分析:

第一步,先链接:

 function createWs(url){
      	try {
	        this.ws = new WebSocket(url);
	        
	        this.init();
	       
	       
	      } catch(e) {
	       
	        this.reconnect(url);
	      }
	      return this.ws
      }

通过new一个webscoket实例,这些都是封装请求的。

第二步,如果和服务器连接成功后,服务器会通过回调函数反馈到前端;
 

init:function(){
			var $this = this
			 this.ws.onopen = function(){
			 	    console.log('开启连接...')
			 	    //console.log($this.ws.readyState)
			 	  
			}
			 this.ws.onmessage = function (res) { 
			  	var senData = JSON.parse(res.data)
			
	         	
	         	console.log('连接成功...')
	       	  };
	       	  this.ws.onclose = function(){ 
	             $this.reconnect();
	             console.log("连接关闭..."); 
	       	  };
	   	      this.ws.onerror = function() {
	   	      	$this.reconnect();
			    console.log('发生异常了...');
			    
			   };
		},

在这过程还有,Socket.readyState————值:0未连接,无法触发回调;1 - 表示连接已建立,可以进行通信。这时侯先触发onopen回调函数,当然在写项目时,也可以这么考虑当open函数触发时,也可以认为readyState状态为1,这时候发送才可以向服务器发送信息,是100%成功的;当然客户端发送信息时,会触发message函数,表示通信成功。

2--表示服务关闭,主要表示服务器长时间没有接受到信息,是会自动断开。这时候就需要重新连接服务器。

3-表示服务出现异常。则也会断开连接。

出现2和3两种状况,我们重新连接服务器。

重连链服务器代码:

 reconnect:function() {
		  if(this.lockReconnect) {
		    return;
		  };
		  this.lockReconnect = true;
		  //没连接上会一直重连,设置延迟避免请求过多
		  this.timer && clearTimeout(this.timer);
		  var $this = this;
		  this.timer = setTimeout(function () {
		    $this.createWebSocket();
		    $this.lockReconnect = false;
		  }, 3000);
		},

有一点特别提示大家注意的是:要注意在scoket.readyState==1情况下,发送信息,发可以成功。发送信息时就是要open触发向服务器发送信息。

接下来要为大家讲诉sse单通道协议,大体上与webscoket相似,它唯一的差别就是不发送数据而已,只接受数据。

	var url = 'http://127.0.0.1:8844/stream'
		if ('EventSource' in window) {
			var source = new EventSource(url);
			source.onopen = function (event) {
				console.log(event);
			};
			source.onmessage = function (event) {
			  var data = event.data;
			  console.log(data);
			  var origin = event.origin;
			  var lastEventId = event.lastEventId;
			  // handle message
			};
			source.onerror = function (event) {
			  // handle error event
			};
			//source.close();手动关闭
	  
		}else{
			alert('不支持webscoket')
		}

		

它的状态为:

0:相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。

1:相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。

2:相当于常量EventSource.CLOSED,表示连接已断,且不会重连。

接受到的数据形式:

data:服务器端传回的数据(文本格式)。

origin: 服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。

lastEventId:数据的编号,由服务器端发送。如果没有编号,这个属性为空。

如果需要根据需求关闭服务则需要呢,代码根据需求合理的关闭:source.close()

参考文档:http://www.runoob.com/html/html5-websocket.html

参考博客:https://www.cnblogs.com/goody9807/p/4257192.html;

参考文档:http://javascript.ruanyifeng.com/htmlapi/eventsource.html

相关文章:

  • 2022-12-23
  • 2021-08-25
  • 2022-01-12
  • 2021-04-02
  • 2022-12-23
  • 2021-04-06
  • 2021-11-17
  • 2021-07-13
猜你喜欢
  • 2022-12-23
  • 2021-05-24
  • 2021-10-19
  • 2021-10-22
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案