Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常

Posted

技术标签:

【中文标题】Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常【英文标题】:Safari Extension: WebSocket connection failure calls onclose and not onerror and no exception 【发布时间】:2014-12-23 00:44:56 【问题描述】:

我正在为 Firefox、Chrome 和 Safari 编写浏览器扩展。当尝试使用 Safari 扩展连接到 WebSocket 服务器时,没有服务器监听特定端口,我的 Safari 扩展不会引发异常,也不会调用 onerror。相反,正在调用 Safari 扩展的 onclose 处理程序。我也在控制台中看到了这条消息:

[Error] WebSocket network error: The operation couldn’t be completed. Connection refused (global.html, line 0)

在 Firefox 和 Chrome 上,它似乎可以正确处理 AFAIK 并调用 onerror。

我只是在做这样的事情:

var socket = new WebSocket('ws://127.0.0.1:'+inPort, inHandlerName);
socket.binaryType = "arraybuffer";

然后声明 onopen、onclose、onerror 和 onmessage 的处理程序。 inPort 是 9000,inHandlerName 是一个类似于“global-handler”的字符串。我在每个 WebSocket 处理程序以及具有创建 WebSocket 的代码的函数中都放置了异常处理程序,但我没有看到任何异常被捕获。

这是一个已知问题吗?有没有办法判断连接是否失败?

编辑: 这也发生在 Safari 中的一个简单网页上:

        var theSocket = new WebSocket('ws://127.0.0.1:9000', 'global-message');

        theSocket.onopen = function()
        
            console.log("onopen");
        ;
        theSocket.onerror = function()
        
            console.log("onerror");
        ;
        theSocket.onmessage = function()
        
            console.log("onmessage");
        ;
        theSocket.onclose = function()
        
            console.log("onclose");
        ;

【问题讨论】:

我需要知道关闭和错误之间的区别的原因是我可以尝试不同的端口号,以防服务器无法绑定到特定端口。如果是关闭,则可能是服务器崩溃了,但最初能够绑定到该端口,因此客户端可能想再次尝试同一端口。 【参考方案1】:

这似乎不是它应该工作的方式,但是在 onclose 消息中,我得到了一个这样的事件参数:

theSocket.onclose = function(event)

并且该事件包含一个称为代码的字段。当我无法连接到服务器时,代码值为 1006。我目前已修复它,以便它检查它是否在 Safari 中运行,然后检查:

if(event.code == 1006)

如果是这样,我将在 Firefox 和 Chrome 的错误情况下执行相同的处理。

【讨论】:

太棒了。我一直在寻找的答案。

以上是关于Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常的主要内容,如果未能解决你的问题,请参考以下文章

iOS 操作扩展,从 Safari 共享 PDF 失败

让 WebSocket 在 Mobile Safari 中保持活跃

在 Swift 4.2 Xcode 10 中使用动作扩展从 Safari 共享 PDF 文件失败

WebSocket 连接失败。 WebSocket握手期间出错-socketjs

WebSocket 连接到 'ws:url' 失败:WebSocket 在连接建立之前关闭

无法启动连接:错误:WebSocket 连接失败