javascript - WebSocket 重试次数有限制吗?

标签 javascript html error-handling websocket

我正在编写一段 JavaScript 代码来与自定义 C# Web 套接字服务器通信,并且按照建议的做法重试连接。

当JS准备好时,服务器可能还没有准备好,所以我需要做的是不断尝试连接websocket,直到最终成功。

推荐的做法告诉我,我需要捕获 onclose 事件或 onerror 事件,并且在其中任何一个事件中,尝试重新连接,最好使用某种退避策略。

根据这个建议,我想出了以下代码:

<html>
    <head>
        <title>WS</title>
    </head>
    <body>
        <h1>WS</h1>

        <button onclick="init()">Connect</button>
        <button onclick="deInit()">Disconnect</button>
        <button onclick="send()">Message</button>

        <script>

            var mySocket;

            function init(){

                mySocket = new WebSocket("ws://localhost:9000/foolish");

                mySocket.onopen = function(){
                    console.log("OPEN");
                };

                mySocket.onclose = function(status){
                    console.log("CLOSE");
                    console.log(status);
                    if(status.code === 1006){
                        mySocket = new WebSocket("ws://localhost:9000/foolish");
                    }
                };

                mySocket.onerror = function(err){
                    console.log("ERROR");
                    console.log(err);
                };

                mySocket.onmessage = function(msg){
                    console.log("MESSAGE");
                    console.log(msg);
                };

            }

            function deInit(){

                mySocket.close();

            }

            function send(){

                mySocket.Send("foo");

            }

        </script>

    </body>
</html>

我尝试在错误处理程序中执行重新连接,并附加到“setTimeOut”调用,输出始终相同。

我的事件处理程序触发一次,重新尝试连接,但第二次失败时,没有任何事件处理程序被触发,我只看到失败的尝试,如下图所示:

enter image description here

我读过的所有内容都告诉我,每次我重试但无法连接时,我的错误处理程序和/或关闭处理程序应该继续触发,让我可以选择处理错误,但它不会尝试两次并且放弃。

这种情况发生在 IE11、IE10、Chrome 50+ 和 FireFox 最新版本中。

考虑到它在浏览器之间的一致性,那么我猜测这要么是设计使然,要么是我做错了,但我真的不明白问题是什么。

如果有人有任何想法,如果您能指出正确的方向,我将不胜感激。

最佳答案

当您在关闭时创建新实例时,您不会重新应用事件处理程序

关于javascript - WebSocket 重试次数有限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40853196/

相关文章:

html - 自定义高度的圆形按钮中间的 Bootstrap 图标

html - CSS/HTML 文本未出现在联系表中

r - 在 R 中调试意外错误——如何找到错误发生的位置?

ruby-on-rails - 使用AJAX显示错误消息Ruby on Rails

javascript - array.includes 使用正则表达式返回 false

javascript - 在 JavaScript 中使用 Function.call.apply 的目的是什么?

javascript - 通过单击子元素获取父级 div id

javascript - 无法从 Material UI 对话框中删除滚动条

javascript - Canvas 图像在碰撞时下沉到边缘

javascript - 如何解决无法在家中重现的客户端Javascript错误?