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