【问题标题】:socket.io-stream error: stream has already been sentsocket.io-stream 错误:流已被发送
【发布时间】:2016-11-29 23:15:43
【问题描述】:

我正在尝试通过带有 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/Chrome。

【问题讨论】:

    标签: javascript node.js socket.io stream


    【解决方案1】:

    每次写入流时,您都在重新发送和重新传输流,而您不需要这样做!

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2021-12-26
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多