我通過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,它被正確接收。但只要我消耗更高的位,如0x81,0xc2被添加到數據中。
我不敢相信我必須對付這個!也許我做錯了什麼,但是我確實在尋找其他框架來通過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));
});
}
感謝您花時間閱讀本文。非常感謝您的幫助。
這種結合是處理二進制數據(如音頻和圖像數據),而不是字符串,我認爲這是「二進制」+字符編碼。我選擇的十六進制值是隨機選擇的,與字符集無關。但是,感謝您花時間回覆。 – raminr
你能否粘貼你的服務器端代碼?只需確保二進制緩衝區不能通過使用「+」來簡單地相互連接,即將二進制轉換爲字符串 – jiajianrong
爲了完成目的,我已將服務器端代碼添加到原始文章。 – raminr