程序员

hello websocket

2018-11-17  本文已影响0人  snow_in

最近在做一个实时的项目,其中一个重要的功能就是实时的从后端获取数据。当时就是有两种方案去实现这个功能,一种是浏览器定时向服务器发送请求,服务器接到请求后返回最新的数据(轮询),还有就是使用H5新增的通信协议webSocket。

其实之前有用过轮询的方式做一些东西,它最大的问题就是返回结果的间隔不是我们想要的。比如

setInterval(function() {
    $.get("/xxx", function(data, status) {
        console.log(data);
    });
}, 2000);

上面的程序是每2秒向后台发送一次请求。我们想要的结果是2秒就可以接收一次数据,根据js事件循环机制我们知道,setInterval只是在规定的时间间隔内向任务队列插入了回调函数,但是不会立即执行,这就会导致每次返回结果的时间并不是恰好隔着2秒。

还有一个问题就是浏览器频繁地向服务器发送请求,可能数据并没有更新,这样就造成很多无用的请求,浪费带宽。

websocket的简单介绍

websocket是一个双向通信的协议,连接建立后,服务器和客户端都能主动地向对方发送和接收数据。Websocket使用ws或wss的统一资源标志符,和http、https类似,wss就是对通信进行加密。

1. 握手协议

建立websocket连接,是需要先通过HTTP/1.1协议的101状态码进行握手的。看一下它的握手请求:


websocket.png

其中最重要的就是
Connection: Upgrade
Upgrade: websocket
表示连接升级到websocket协议。
Sec-WebSocket-Version 表示支持的websocket版本
Sec-WebSocket-Key 主要用来生成响应头中Sec-WebSocket-Accept的值

2、优点

对于websocket的优点,我们看一下维基百科里面的介绍(websocket):

使用

const ws = new WebSocket(`ws://example.com/newEnergyWebSocket`);
       
        ws.onopen = (evt) => { // 连接成功后的回调函数
          console.log('Connection open ...', ws.readyState);
          if (ws.readyState === 1) {
            ws.send(1); // 向服务器发送数据,可以在这里传递接口参数
          }
        };

        ws.onmessage = (evt) => { // 收到数据后的回调函数
          console.log('Received Message: ');
         // 接收数据
        };

       ws.onclose = (evt) => { // 连接关闭后的回调函数
          console.log('Connection closed.');
        };

webSocket.readyState返回当前实例的连接状态:

要想关闭连接调用close方法:

 ws.close()

后端用的公司的框架,一开始因为tomcat版本太低一直报错:


websocket1.png

后来升级到7.0.7之后就好了。

上一篇 下一篇

猜你喜欢

热点阅读