首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socket.IO-流错误:流已经发送

Socket.IO-流错误:流已经发送
EN

Stack Overflow用户
提问于 2016-11-29 23:15:43
回答 1查看 1.3K关注 0票数 2

我试图通过一个带有Socket.IO流的node.js服务器将一个客户机的256x256画布上的二进制数据输送到另一个客户端的画布上。

在我的服务器上:

代码语言:javascript
复制
ss(socket).on('blatin', function(stream, data) {
    var outgoingstream = ss.createStream();
    ss(remote).emit('blatout', outgoingstream);
    stream.pipe(outgoingstream);
});

在源客户机中:

代码语言:javascript
复制
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;
}

在目标客户端:

代码语言:javascript
复制
ss(socket).on('blatout', function(stream, data)
    stream.on('data', function(chunk) {
        imageData.data.set(new Uint8ClampedArray(chunk));
        ctx.putImageData(imageData,0,0);
    });
});

…这是可行的,但非常慢,在我的源客户端的控制台中,我看到这个错误一遍又一遍地重复:

代码语言:javascript
复制
socket.io-stream.js:794 Uncaught Error: stream has already been sent.

所以我显然没能处理好这条小溪。我错过了哪一步?

备注:

  • 很容易填充缓冲区,并将其缓慢地清空到目标客户端。-在服务器停止响应之前,也很容易使服务器超载。
  • 节流sendBlat()是没有帮助的。
  • 发送画布ImageData是目标,而不是绘图应用--这个应用只是概念的证明。
  • MacOS/Chrome
EN

回答 1

Stack Overflow用户

发布于 2016-11-30 15:45:55

你每次写信给它的时候都在重新发射和重新输送溪流,而你不需要这样做!

to流示例假设每次上传新文件(因此是新流),每个文件都需要一个新的emit()才能到达服务器,需要一个新的pipe()才能到达其他任何地方。

但是在您的情况下,您可以简单地一次又一次地重写同一个流,这意味着您只需要从源客户机中重写一次,在服务器上只需要一次emit()

服务器:

代码语言:javascript
复制
var outgoingstream = ss.createStream();
ss(remote).emit('blatout', outgoingstream);
ss(socket).on('blatin', function(stream, data) {
  stream.pipe(outgoingstream);
});

源客户端:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40877535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档