socket nodejs example ejemplo javascript node.js websocket arraybuffer

javascript - example - websocket nodejs



Recibir datos de WebSocket ArrayBuffer en el navegador-recibir cadena en su lugar (2)

He estado jugando con websockets recientemente y al menos esto parece funcionar:

if(event.data instanceof ArrayBuffer) { var wordarray = new Uint16Array(event.data); for (var i = 0; i < wordarray.length; i++) { console.log(wordarray[i]); wordarray[i]=wordarray[i]+1; } console.log("End of binary message"); console.log("sending changes"); ws.send(wordarray.buffer); }

Básicamente, estoy creando una nueva matriz basada en event.data

Tengo una aplicación de servidor node.js y un cliente de navegador. El envío del navegador de datos ArrayBuffer -> el servidor funciona a la perfección, pero el servidor -> el navegador da como resultado una cadena "[object ArrayBuffer]" está recibiendo. Esto sucede en las últimas versiones de Chrome y Firefox.

Servidor:

var serverPort = 9867; // dependencies var webSocketServer = require(''websocket'').server; var http = require(''http''); var players = {}; var nextPlayerId = 0; // create http server var server = http.createServer(function(request, response) { }); server.listen(serverPort, function() { console.log((new Date()) + " Server is listening on port " + serverPort); }); // create websocket server var wServer = new webSocketServer({ httpServer: server }); // connection request callback wServer.on(''request'', function(request) { var connection = request.accept(null, request.origin); connection.binaryType = "arraybuffer"; var player = {}; player.connection = connection; player.id = nextPlayerId; nextPlayerId++; players[player.id] = player; console.log((new Date()) + '' connect: '' + player.id); // message received callback connection.on(''message'', function(message) { if (message.type == ''binary'' && ''binaryData'' in message && message.binaryData instanceof Buffer) { // this works! console.log(''received:''); console.log(message); } }); // connection closed callback connection.on(''close'', function(connection) { console.log((new Date()) + '' disconnect: '' + player.id); delete players[player.id]; }); }); function loop() { var byteArray = new Uint8Array(2); byteArray[0] = 1; byteArray[0] = 2; for (var index in players) { var player = players[index]; console.log(''sending: ''); console.log(byteArray.buffer); player.connection.send(byteArray.buffer); } } timerId = setInterval(loop, 500);

Cliente:

<!DOCTYPE html> <html> <head> </head> <body> <script type="text/javascript"> window.WebSocket = window.WebSocket || window.MozWebSocket; var connection = new WebSocket(''ws://127.0.0.1:9867''); connection.binaryType = "arraybuffer"; // most important part - incoming messages connection.onmessage = function (event) { document.getElementById("log").innerHTML += typeof(event.data) + '' ''; document.getElementById("log").innerHTML += event.data + '' ''; if (event.data instanceof ArrayBuffer) { // string received instead of a buffer } }; window.onkeydown = function(e) { var byteArray = new Uint8Array(2); byteArray[0] = 1; byteArray[1] = e.keyCode; connection.send(byteArray.buffer); }; </script> <div id=''log''>Log: </div> </body> </html>

¿Qué estoy haciendo mal?

Editar:

Desde la fuente websocket node.js:

WebSocketConnection.prototype.send = function(data, cb) { if (Buffer.isBuffer(data)) { this.sendBytes(data, cb); } else if (typeof(data[''toString'']) === ''function'') { this.sendUTF(data, cb); }

Entonces, si usa un Uint8Array , envía los datos como una cadena, en lugar de usar sendBytes , ya que sendBytes necesita un objeto Buffer . Como en la respuesta a continuación, necesito sendBytes . Como no puedo pasar un ArrayBuffer a sendBytes , hice esto en el servidor:

function loop() { var buffer = new Buffer(2); buffer[0] = 1; buffer[1] = 2; for (var index in players) { var player = players[index]; console.log(''sending: ''); console.log(buffer); player.connection.send(buffer); } }

Ahora funciona.

Conclusión:

Mientras que los websockets de Chrome y Firefox .send() un buffer Uint8Array como datos binarios, parece que los websockets de node.js lo envían como datos de string , y usted necesita un Buffer Buffer para enviar archivos binarios.


enviar datos binarios usar el método sendBytes() .