我试图通过带有socket.io-stream的node.js服务器将二进制数据从一个客户端的256x256画布传输到另一个客户端的画布。
在我的服务器中:
ss(socket).on('blatin', function(stream, data) {
var outgoingstream = ss.createStream();
ss(remote).emit('blatout', outgoingstream);
stream.pipe(outgoingstream);
});
在源客户端中:
canvas.addEventListener("mousemove", function(e){
sendBlat();
});
var socket = io();
var stream = ss.createStream();
var imageBuffer = new ss.Buffer(256*256*4);
function sendBlat() {
console.log('blatting');
// send buffer to the server
imageBuffer.set(ctx.getImageData(0,0,canvas.width,canvas.height).data);
stream.write(imageBuffer);
ss(socket).emit('blatin', stream);
return false;
}
在目的地客户端:
ss(socket).on('blatout', function(stream, data)
stream.on('data', function(chunk) {
imageData.data.set(new Uint8ClampedArray(chunk));
ctx.putImageData(imageData,0,0);
});
});
...这有效,但速度很慢,在我的源客户端控制台中,我看到这个错误一遍又一遍地重复:
socket.io-stream.js:794 Uncaught Error: stream has already been sent.
所以我显然没有正确处理流。我错过了哪些步骤?
备注:
sendBlat()
没有帮助。答案 0 :(得分:0)
每次写信时,您都会重新发送和重新管理流,而且您不需要这样做!
socket.io-stream示例假设您每次都要上传新文件(以及新流),每个文件都需要新的emit()
才能到达服务器,而新的{ {1}}去别的地方。
但是在你的情况下,你可以简单地一遍又一遍地重写同一个流,这意味着你只需要从源客户端pipe()
一次,并在服务器上只需emit()
一次。
服务器:
pipe()
来源客户:
var outgoingstream = ss.createStream();
ss(remote).emit('blatout', outgoingstream);
ss(socket).on('blatin', function(stream, data) {
stream.pipe(outgoingstream);
});