我正在尝试将二进制数据从一个客户的256x256画布从一个客户端的canvas传输到socket.io-stream的node.js服务器上。
在我的服务器中:
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()
无济于事。 - 发送帆布imagedata是目标,而不是绘图应用程序 - 该应用只是概念证明。
- macos/chrome。
每次写入时,您都会重新发出并重新填充流,而您无需这样做!
socket.io-stream示例假设您每次都在上传新文件(以及新的流),每个文件都需要新的emit()
才能进入服务器,而新的pipe()
则可以进入其他任何地方。<<<<<<<<<<<<<<
但是,在您的情况下,您可以一遍又一遍地重写相同的流,这意味着您只需要从源客户端进行emit()
,然后在服务器上一次pipe()
。
服务器:
var outgoingstream = ss.createStream();
ss(remote).emit('blatout', outgoingstream);
ss(socket).on('blatin', function(stream, data) {
stream.pipe(outgoingstream);
});
源客户端:
var socket = io();
var stream = ss.createStream();
ss(socket).emit('blatin', stream);
var imageBuffer = new ss.Buffer(256*256*4);
function sendBlat() {
imageBuffer.set(ctx.getImageData(0,0,canvas.width,canvas.height).data);
stream.write(imageBuffer);
return false;
}