2013-12-18 160 views
7

我通過websockets發送大量的JSON數據。 JSON可能有超過1000個條目。由於幀大小的限制,Websocket協議會自動將JSON分解爲幀,這是無法幫助的。因爲我們無法改變websockets的框架大小。Websocket框架大小限制

問題:

當我嘗試使用JSON.parse它給了我一個解析錯誤,因爲該框架是不完整的JSON對象這是顯而易見的,以評估我的JSON。所有這些都發生在Websocket onmessage事件回調中。我如何以不同的框架接收巨大的JSON並仍然能夠解析它? 我試圖連接onmessage幀仍然錯誤仍然存​​在。

方問題:

如何正確concatinate一個破碎的JSON?

+0

側回答:爲了不留任何大塊... – Eloff

+0

對此有何分辨率是多少?我面臨同樣的問題。 –

+0

將此列表中的緩衝區大小參數添加到您的web.xml中 https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/cpr/ApplicationConfig.java –

回答

15

單個的WebSocket幀,每RFC-6455 base framing,具有2^63個字節的最大大小限制(9,223,372,036,854,775,807字節〜= 9.22艾字節)(由@Sebastian校正)

然而,WebSocket的消息,由的1幀或更多幀,從協議層面對其沒有限制。

每個WebSocket實現都將以不同方式處理消息和幀限制。比如設置整條消息的最大消息大小(通常出於內存消耗的原因),或者爲大消息提供流選項以更好地利用內存。

但在你的情況下,你選擇的WebSocket實現可能有一個錯誤,並且不恰當地將JSON消息拆分成多個消息而不是多個幀。您可以使用Chrome中的網絡檢測工具或Wireshark等外部工具來確認此行爲。

+2

它不會在多個消息中拆分JSON,它將拆分爲多個幀。我知道,只是因爲我使用Chrome工具進行了檢查。我如何處理它?我正在使用大氣框架。 –

+0

您是否嘗試更改websocket的緩衝區大小?讓我們討論Atmosphere郵件列表,但是我懷疑你需要增加服務器websocket緩衝區大小。 – jfarcand

1

由於您正在處理低級的WS,因此您需要創建一個應用程序協議來處理通過多個WS框架發送的數據。這取決於你連接每個WS幀中的數據(順便說一句,不要連接幀......連接每幀中的數據)。

基本上你正在重新創建一個文件傳輸協議。

0
var wsServer = new websocket.server({ 
      httpServer: server, 
      maxReceivedFrameSize: 131072, 
      maxReceivedMessageSize: 10 * 1024 * 1024, 
      autoAcceptConnections: false 
     }); 

更改默認maxFrameSize & MESSAGESIZE