socket.io-stream错误:流已经发送

时间:2016-11-29 23:15:43

标签: javascript node.js socket.io stream

我试图通过带有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()没有帮助。
  • 发送画布ImageData是目标,而不是绘图应用程序 - 应用程序只是一个概念证明。
  • 的MacOS /铬。

1 个答案:

答案 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);
});