0

我正在编写一个应用程序,它首先尝试打开一个 WebSocket 连接(以确保没有其他连接打开;地址冲突检查),然后触发一个自定义协议,该协议将使用浏览器告诉它的地址启动一个一次性 WebSocket 服务器. 所有通信都是通过 localhost 和一些任意端口号完成的,比如 3000。我没有做任何特别的事情,只是试图打开一个 WebSocket:

var socket = new WebSocket("ws://localhost:3000/MyApp/");
socket.onclose = function(e) { console.error(e); }

在 Chrome 中进行测试时,WebSocket 实际上会保持一段时间的 CONNECTING 状态,这是理想的,因为它给了我们一些时间来通过自定义协议实际启动应用程序。但在 Firefox 中,WebSocket立即以代码 1006 关闭,我不知道为什么。

我尝试将 about:config network.websocket.timeout.open 设置更改为 1000(从 20 开始),但这无济于事。我还发现了这个相关的帖子:Websockets - chrome and firefox Differences? . 这也没有让我找到答案。

我错过了什么?

21 年 11 月 16 日更新
我正在使用 Chrome 和 FF 中的开发工具来检查请求。奇怪的是,Chrome 实际上是按照您的预期发送请求标头,但在 FF 中,请求完全是空的(0 字节)。也许这是FF不支持调试本机WebSockets(没有使用包装库)的问题?是否有一些 FF 设置可以取消请求?但更令人困惑的是,浏览器会点击 close 事件而不会点击 open 事件。

21 年 11 月 17 日更新
我意识到这可能与启动自定义协议处理程序有关?我注意到如果没有启动 CPH,它会等待一秒钟来尝试连接到 Web 服务器,但是当我启动 CPH时它会立即关闭 WebSocket。CPH 通过指向“_parent”的链接启动。

4

1 回答 1

0

看起来自定义协议导致 FF 停止尝试提前连接。我在 JS 代码中创建了一个锚元素 <a>,并在构造它之后在其上调用了“click()”。无论我给它什么目标(例如_self),它都会导致连接尝试停止。

长话短说,启动一个链接,无论是 a.click、window.open 还是 location.replace,都会导致 Firefox 拒绝任何当前正在轮询的 WebSockets!

解决方法是只使用 iframe 来启动自定义协议。

于 2021-11-17T22:10:08.347 回答