美文网首页
webSocket的二三事

webSocket的二三事

作者: 忽如寄 | 来源:发表于2017-04-05 23:16 被阅读338次

传统中网站实现实时推送往往是一件比较难的事情,因为HTTP是无状态的,请求只能是由客户端发送,服务器处理这些请求,服务器是被动的,服务器有变化却没有办法将数据主动传输给客户端,传统中解决这种问题主要以下方法:

1、轮询

设定一个定时器发送Ajax请求,当检测数据是否发生变化,它的代码可能如下:

function query() {
    var xhr = new new XMLHttpRequest();
    xhr.open('GET','/data', true);
    xhr.load = function(e) {
        if(e.status == 200) {
            var ret = JSON.parse(e.response);
            if(ret.changed){
                //........
            } else{
                setTimeout(query, 1000);
            }
        }
    }
    xhr.send();
}

query();

轮询的缺点非常明显,首先客户端需要发送大量请求,而服务端需要处理大量请求,这些资源的消耗其实很大一部分都是没有必要的,而且应用的实时性与轮询设定的时间有关。

2、长轮询

长轮询主要利用的是HTTP协议的长连接,当客户端发送一个ajax请求后,服务器查询数据是否有更改,如果有更改就立即返回,没有就hold住请求不返回,这样客户端就会一直处于pending状态,服务器端保持不断查询数据是否更新,一旦更新就返回,这样就做到了数据的实时传递。
显然长轮询消耗的客户端资源较少,但是服务端要hold一个连接同样要消耗部分资源。

这些解决方案都是基于HTTP协议的,而HTTP协议每次请求都需要带上报文头,这需要消耗一定的资源,对于实时应用来说这部分资源算是不小的开销了,而WebSocket将传统的套接字概念引入web,这样在web建立全双工通信通道成为了可能。

WebSocket客户端
WebSocket是一种新的通信协议,新建一个WebSocket协议时需要制定连接的地址,以ws开头,同样与http类似,安全连接以wss开头,客户端建立一个连接只需要调用WebSocket()构造函数即可,这个函数接受一个url参数和一个可选的子协议参数,子协议参数可以是字符串或者数组:

var socket = new WebSocket('wss://localhost/chat', ['soap', 'xmpp']);

一个WebSocket实例主要有以下属性:

  • url:实例的url地址
  • protocol:创建实例时传递的子协议,没有则是空字符串,有的话为传递的第一个协议的字符串
  • extensions:服务器选定的拓展
  • readyState:连接的当前状态,有四种状态:
    CONNECTION: 连接还没开启,对应的readyState值为0
    OPEN: 连接已经建立,可以开始通信了,对应的readyState值为1
    CLOSING: 连接正在关闭的过程中,对应的readyState值为2
    CLOSED: 连接已经关闭,对应的readyState值为3
    因此判断连接当前的状态可以判断readyState的值,或者是与状态比对:
if(socket.readyState === 1) {
        console.log('连接已经打开');
}
// or
if(socket.readyState === WebSocket.OPEN){
        console.log('连接已经打开');
}
  • binaryType:二进制传输的内容的类型
  • onclose:关闭连接的事件监听器
  • onerror:错误发生的事件监听器
  • onmessage:消息到达的事件监听器,事件监听器中的回调函数的事件e中的data属性代表数据内容
socket.onmessage = function(e){
        console.log('server send ' + e.data);
}
  • onopen:连接打开的事件监听器(因为这个连接是异步的)

一个WebSocket实例主要有以下方法:

  • close:用来关闭连接
socket.close();
  • send:用来向服务器发送数据:
socket.send('something from client');

相关文章

  • webSocket的二三事

    传统中网站实现实时推送往往是一件比较难的事情,因为HTTP是无状态的,请求只能是由客户端发送,服务器处理这些请求,...

  • 《暖心二三事》目录

    【记录生活中的点滴暖心事】 第一篇:暖心二三事① 第二篇:暖心二三事② 第三篇:暖心二三事③ 第四篇:暖心二三事④...

  • 二三事二三字

    1. 寄居黑夜的微光暗暗生长 2.绿色的诺言铺天盖地林子里的冰雪再无旧人重温 3.春水的哀愁撩不倒胡杨林永恒的站姿...

  • 二三人,二三事

    人生在世,不同的时期和环境里,我们总会遇到不同的人。志趣相投,能与之无话不谈,是以为友,因为朋友这一角色的存在,使...

  • 教学二三事

    教学二三事

  • 二三事

    日子过了太久,故事的轮廓就开始模糊。每个人都有故事,倾泻在酒后不明的夜里,或者在浓妆艳抹的女郎身旁,或者在空廖的一...

  • 二三事

    今天,我们一家三口一起参加徒步活动。徒步的固定集合时间是早上9点,过时不候。 由于这次的徒步集合地点离家有点远,大...

  • 二三事

    不记得哪一年的儿童节了,印象中这是唯一一次三兄妹一起没有和父母一同进城的经历。可能是父母的叮嘱,一定要照张合照,如...

  • 二三事

    两年的时间匆匆忙忙从一个女孩变成一个妈妈,生活中的琐事总是不期而遇的向你扑头盖面砸过来,压的喘不过气。 慢...

  • 二三事

    如果我们把目光延伸到外部世界,而不是局限于自我情绪,生活就会变得简单处理的多。很遗憾,发现这一生活法则的时...

网友评论

      本文标题:webSocket的二三事

      本文链接:https://www.haomeiwen.com/subject/cucxattx.html