我正在撰寫一個應用程式,它首先嘗試打開 WebSocket 連接(以確保沒有其他連接處于打開狀態;地址沖突檢查),然后再觸發自定義協議,該協議將使用瀏覽器告訴它的地址啟動一次性 WebSocket 服務器. 所有通信都是通過本地主機和一些任意埠號完成的,比如 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 和 firefox 的區別?. 這也沒有讓我找到答案。
我錯過了什么?
21 年 11 月 16 日更新
我正在使用 Chrome 和 FF 中的開發工具來檢查請求。奇怪的是,Chrome 實際上按照您的預期發送請求標頭,但在 FF 中,請求完全為空(0 位元組)。也許這是 FF 不支持除錯本機 WebSockets(沒有使用包裝庫)的問題?是否有一些 FF 設定可以拒絕請求?但更令人困惑的是,瀏覽器會在未命中 open 事件的情況下觸發 close 事件。
21 年 11 月 17 日更新
我意識到這可能與啟動自定義協議處理程式有關?我注意到,它會等待第二次嘗試連接到Web服務器,如果沒有CPH推出,但后來當我做啟動CPH,這是當它立即關閉WebSocket的。CPH 是通過指向“_parent”的鏈接啟動的。
uj5u.com熱心網友回復:
看起來自定義協議導致 FF 停止嘗試提前連接。我在 JS 代碼中創建了一個錨元素 <a>,并在構造它后在它上面呼叫了“click()”。無論我給它什么目標(例如_self),它都會導致連接嘗試停止。
長話短說,啟動一個鏈接,無論是 a.click、window.open 還是 location.replace,都會導致 Firefox 拒絕任何當前輪詢的 WebSockets!
解決方法是僅使用 iframe 來啟動自定義協議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359521.html
標籤:javascript 火狐 网络套接字
