2014-03-30 59 views
2

我有一個通過WebSockets連接到服務的Web應用程序。這個程序能正常工作在Chrome/Firefox瀏覽器的桌面,但是Chrome行動給出了錯誤:WebSockets在桌面瀏覽器中工作,但在Android版Chrome中失敗

WebSocket connection to 'ws://192.168.0.11:8080/' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 0

服務器使用最近的libwebsockets版本。

在初始連接期間發生此錯誤,於是一大堆JSON數據通過多個2048字節幀發送到客戶端。

服務器公開了幾個不同的WebSocket。他們中的一些失敗,在其他方面也:

Could not decode a text frame as UTF-8.

......還有......

Unrecognized frame opcode: 6

可以預測哪些失敗了,哪些應該繼承尚未顯露出來的模式。

我懷疑某種形式的框架問題在這裏。我回顧了WireShark中的消息,他們看起來對我很正確。標題看起來是正確的。

爲什麼在桌面版Chrome/Firefox中可以正常工作,但在Android版Chrome中會失敗?

+0

我已經從WireShark [此處下載](https://mega.co.nz/#!m4AG2DjJ!mKMmgYlRyPg0SdianSqMmDi_mdRQEFYNTyDyHjONqzA)放置捕獲。 –

+0

發生這些錯誤的原因是客戶端無法正確解碼幀,所以它試圖從一堆位中理解,有時候解析頭文件失敗,有時候這些位看起來像是頭文件,但是這些文件只是垃圾文件。您是否可以強制您的應用始終提供128個字節的幀並查看?這可能是Chrome Android處理部分框架的錯誤。這很有意思,請保留帖子以更新您的發現。 – vtortola

+0

@vtortola,請參閱我的回答以獲取最新發現和解決方法。 –

回答

3

WireShark packet capture顯示有一些幀溢出兩個TCP數據包。錯誤消息的變化表明隨機有效載荷被解釋爲標題。我修改了我的服務器,使最大數據包大小爲1024字節,而不是2048字節,從而抑制了錯誤。

我不知道這是否是Android版Chrome中的錯誤,或者桌面版本是否容忍某些違反其移動表哥不會的規範。我懷疑前者。

編輯在我的平板電腦上,我也通過進入chrome://flags並啓用實驗性WebSocket支持來解決該問題。

+0

幀溢出兩個TCP數據包應與客戶端無關。我認爲這是Android Chrome上的一個錯誤,它不能正確讀取幀邊界。 – vtortola

相關問題