美文网首页
WebSocket使用总结

WebSocket使用总结

作者: pisfans | 来源:发表于2019-04-22 13:34 被阅读0次

简介

HTTP 协议:通信只能由客户端发起。他可以做成轮询的形式但是浪费资源。HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,TCP连接中可以有多个HTTP连接,但HTTP连接依然是“一次性的”。仍然是客户端主动发起。
WebSocket :服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。建立在 TCP 协议之上,协议标识符是ws(如果加密,则为wss)。

Js客户端

<script type="text/javascript">
    var websocket = null;
    //判断当前浏览器是否支持WebSocket
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8080/websocket");
    }
    else {
        alert('当前浏览器 Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function () {
        setMessageInnerHTML("WebSocket连接发生错误");
    };

    //连接成功建立的回调方法
    websocket.onopen = function () {
        setMessageInnerHTML("WebSocket连接成功");
    }

    //接收到消息的回调方法
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function () {
        setMessageInnerHTML("WebSocket连接关闭");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function () {
        closeWebSocket();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //关闭WebSocket连接
    function closeWebSocket() {
        websocket.close();
    }

    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>

问题

websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 http 降级?
所以大部分不重要的业务,使用 ws 不如使用 http 轮训来的简单、实在。
ws 长连接的用户收到消息是个 push 操作,http 轮训用户收消息是 pull 操作,push 都存在单生产推多消费,为广播模型,怎么处理好连接,保障每个消费推且只推一次,很多程序员这个问题不一定能够解决。
pull 就不一样了,消费方想要你就来生产方拉一下,拉几次,消息就准确的送达几次,不存在多消费和连接处理的问题,缺点当然就是消息推送的不及时,优点非常明显,简单易实现。
websocket 当然也不是没有用,企业内部业务系统之间有时候用 http 协议,又想要消息及时推送,上个 mq 太粗暴,用 grpc 这些支持双向流的 rpc 协议太复杂,此时 ws 就非常好使了。
本人在公司做过多个 ws 协议的服务端项目,使用体验非常不错,最头疼的当然就是断线重连的问题。
网页版钉钉的确是 ws, 但不支持在多个页面登录, 登录第二个页面就把之前的给踢掉了。

问题一:WebSocket连接后一分钟自动断开关闭
这是因为websocket长连接有默认的超时时间(1分钟,由proxy_read_timeout决定),就是超过一定的时间没有发送任何消息,连接会自动断开。解决办法就是让浏览器每隔一定时间(要小于超时时间)发送一个心跳。代码如下:
window.setInterval(function(){ //每隔5秒钟发送一次心跳,避免websocket连接因超时而自动断开
var ping = {"type":"ping"};
ws.send(JSON.stringify(ping));
},5000);

相关文章

  • WebSocket使用总结

    简介 HTTP 协议:通信只能由客户端发起。他可以做成轮询的形式但是浪费资源。HTTP1.1中进行了改进,使得有一...

  • React Native 学习总结(四)

    本章主要总结网络的使用。 1.使用Fetch 2.使用async/await 3.使用ajax 4.websocket

  • WebSocket的简单使用

    需要用到webSocket,所以搜集了一下使用方法,总结下自己的经验 首先要导入webSocket的包,git下载...

  • 【Java基础】WebSocket在Spring中的使用

    WebSocket 使用 关于怎么使用WebSocket,以及WebSocket的一些概念,这篇文章[https:...

  • Websocket

    使用WebSocket WebSocket 接受一个url参数,然后使用WebSocket对象的构造函数来建立与服...

  • Express Websocket使用

    本文主要介绍express+websocket的使用 WebSocket WebSocket 协议在2008年诞生...

  • websocket

    Websocket 协议 Websocket 遵循 rfc6455 标准。websocket使用HTTP作为它的传...

  • vue+websocket使用总结

    安装sockjs-client和stompjs npm/cnpm install sockjs-clentnpm/...

  • 2020-12-07

    vue使用WebSocket接受推送消息 webSocket(){ constthat=this; if(type...

  • WebSocket

    本文介绍 WebSocket 协议的使用方法。 一、为什么需要 WebSocket? 初次接触 WebSocket...

网友评论

      本文标题:WebSocket使用总结

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