我试图通过一个带有Socket.IO流的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()是没有帮助的。发布于 2016-11-30 15:45:55
你每次写信给它的时候都在重新发射和重新输送溪流,而你不需要这样做!
to流示例假设每次上传新文件(因此是新流),每个文件都需要一个新的emit()才能到达服务器,需要一个新的pipe()才能到达其他任何地方。
但是在您的情况下,您可以简单地一次又一次地重写同一个流,这意味着您只需要从源客户机中重写一次,在服务器上只需要一次emit()。
服务器:
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;
}https://stackoverflow.com/questions/40877535
复制相似问题