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



我正在尝试将二进制数据从一个客户的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;
}

相关内容

  • 没有找到相关文章

最新更新