2016-11-17 32 views
1

我通過WebSocket接收二進制數據時遇到了問題,其中瀏覽器接收到的字節數(以ArrayBuffer的形式,JavaScript)高於服務器發送的數據量,即使Chrome或Firefox正確報告通過電線傳輸的字節數。WebSocket二進制傳輸比發送的服務器返回更多的數據

服務器端是Node JS,我使用了3個不同的包(ws,nodejs-websocket和websocket),它們都表現相同。所以這個問題很可能是JavaScript在瀏覽器中運行。

我在客戶端的代碼如下所示:

1: var socket = new Websocket(url); 
2: socket.binaryType = 'arraybuffer'; 
3: socket.onmessage = function(event) { 
4:  var buffer = new Uint8Array(event.data); 
5:  // consume the buffer 
6: } 

的問題是,如果我檢查的「緩衝」的長度(4號線)之後,它不是從服務器發送的數據更高。

例如,如果服務器發送二進制內容,8個字節:

0xa1 0xb2 0xc3 0xd4 0xa1 0xb2 0xc3 0xd4 

在客戶端上,我看到:

0xc2 0xa1 0xc2 0xb2 0xc3 0x83 0xc3 0x94 0xc2 0xa1 0xc2 0xb2 0xc3 0x83 0xc3 0x94 

UPDATE:經過進一步檢查,我相信這與內存中數據的字對齊有關。例如,如果我發送以下數據:0x7C 0x7D 0x7E 0x7F,它被正確接收。但只要我消耗更高的位,如0x810xc2被添加到數據中。

我不敢相信我必須對付這個!也許我做錯了什麼,但是我確實在尋找其他框架來通過websocket傳輸二進制數據,事實上,他們正在將一個字對齊的數組緩衝區中的真實數據「解包」。

更新2:完成的目的,這是發生了什麼事在服務器上,使用包裝的NodeJS websocket,其中康恩的WebSocket包所獲得的網絡套接字連接。

function sendBinary(conn, filename) { 
    var size = 4096; 
    var inputStream = fs.createReadStream(
     filename, 
     { 
      'flags': 'r', 
      'encoding': 'binary', 
      'bufferSize': size 
     }); 
    inputStream.on('data', function(data) { 
     conn.sendBytes(new Buffer(data)); 
    }); 
} 

感謝您花時間閱讀本文。非常感謝您的幫助。

回答

3

當打印或寫入流時,請務必使用原始緩衝流,而不是字符串。 在你的情況下,你可能打印字符串而不是緩衝區。 buf.toString()使用默認編碼UTF-8,而UTF-8中的中文字符需要3個字節,然後得到意外的字節。

順便說一句,0xa1就是中國的字符開始

請使用iconv-lite 將字符串轉換爲緩衝區,如果你需要

或指this post二進制緩存在服務器端

+0

這種結合是處理二進制數據(如音頻和圖像數據),而不是字符串,我認爲這是「二進制」+字符編碼。我選擇的十六進制值是隨機選擇的,與字符集無關。但是,感謝您花時間回覆。 – raminr

+0

你能否粘貼你的服務器端代碼?只需確保二進制緩衝區不能通過使用「+」來簡單地相互連接,即將二進制轉換爲字符串 – jiajianrong

+0

爲了完成目的,我已將服務器端代碼添加到原始文章。 – raminr

相關問題