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()
.