Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何通过socket.io将数据流传输到客户端_Node.js_Sockets_Socket.io_Event Stream - Fatal编程技术网

Node.js 如何通过socket.io将数据流传输到客户端

Node.js 如何通过socket.io将数据流传输到客户端,node.js,sockets,socket.io,event-stream,Node.js,Sockets,Socket.io,Event Stream,我让socket.io将一个基本对象从服务器发送到客户端。这个钻头很好用 现在,我们希望使用(特别是块链查询的结果)将流从服务器发送到客户端。我在浏览器控制台中得到意外结果 var io = require('socket.io')(server); var dsteem = require('dsteem') var es = require('event-stream') var util = require('util') var client =

我让socket.io将一个基本对象从服务器发送到客户端。这个钻头很好用

现在,我们希望使用(特别是块链查询的结果)将流从服务器发送到客户端。我在浏览器控制台中得到意外结果

    var io = require('socket.io')(server);
    var dsteem = require('dsteem')
    var es = require('event-stream') 
    var util = require('util')
    var client = new dsteem.Client('https://api.steemit.com')
    var stream = client.blockchain.getBlockStream()

/* This sends results to stdout, fine
io.on('connection', function(socket){
    stream.pipe(es.map(function(block, callback) {
        callback(null, util.inspect(block) + '\n') 
    })).pipe(process.stdout);

    // And this sends a simple object to the client 
    socket.emit('blockchainOps', {"Foo!":"Doo!"} );
});
*/

// Putting both together sends strange connection data to client
io.on('connection', function(socket){

        socket.emit('blockchainOps', function() {

            stream.pipe(es.map(function(block, callback) {
                callback(null, util.inspect(block) + '\n');
            }))
        })

    });
我在客户端控制台中看到的似乎是某种TCP套接字函数

ƒ(){if(!n){n=!0;var r=a(参数);u(“发送确认%j”,r),e.packet({type:i.ack,id:t,data:r})}

有人能帮我理解发生了什么事,我做错了什么吗

==编辑更新==

正如在评论中所建议的,我已经试着去扩充

这一次,我在浏览器控制台中返回了一个套接字对象,它似乎不是我所希望的流数据


您使用的是
套接字。emit
错误,您将ACK回调传递给客户端而不是流。查看
socket.emit
socket.emit(eventName[,…args][,ack])

你可能想要像这样的东西

socket.emit('blockchainOps', client.blockchain.getBlockStream());
然而,我认为普通套接字io不支持这样的流传递。将流向下输送到您可以使用的客户端。它看起来是这样的:

var ss = require('socket.io-stream');
var stream = ss.createStream();

ss(socket).emit('blockchainOps', stream);
client.blockchain.getBlockStream().pipe(stream);
    <script src="socket.io/socket.io.js"></script>
    <script src="socket.io-stream.js"></script>
    ...
    ss(socket).on('blockchainOps', function(stream) {
       var binaryString = "";

       stream.on('data', function(data) {
           for(var i=0;i<data.length;i++) {
                binaryString+=String.fromCharCode(data[i]);
           }                
       });

        stream.on('end', function(data) {
             console.log(binaryString);
             binaryString = "";
       });
    });
编辑:

在客户端上,您应该能够像这样读取流:

var ss = require('socket.io-stream');
var stream = ss.createStream();

ss(socket).emit('blockchainOps', stream);
client.blockchain.getBlockStream().pipe(stream);
    <script src="socket.io/socket.io.js"></script>
    <script src="socket.io-stream.js"></script>
    ...
    ss(socket).on('blockchainOps', function(stream) {
       var binaryString = "";

       stream.on('data', function(data) {
           for(var i=0;i<data.length;i++) {
                binaryString+=String.fromCharCode(data[i]);
           }                
       });

        stream.on('end', function(data) {
             console.log(binaryString);
             binaryString = "";
       });
    });

...
ss(套接字).on('blockchainOps',函数(流){
var binaryString=“”;
stream.on('data',函数(data){

对于(var i=0;i您使用的
socket.emit
错误,您将ACK回调传递给客户端而不是流。请查看
socket.emit
socket.emit(eventName[,…args][,ACK])

你可能想要像这样的东西

socket.emit('blockchainOps', client.blockchain.getBlockStream());
但是,我认为普通套接字io不支持这样的流传递。要将流向下传递到客户端,您可以使用它。它将如下所示:

var ss = require('socket.io-stream');
var stream = ss.createStream();

ss(socket).emit('blockchainOps', stream);
client.blockchain.getBlockStream().pipe(stream);
    <script src="socket.io/socket.io.js"></script>
    <script src="socket.io-stream.js"></script>
    ...
    ss(socket).on('blockchainOps', function(stream) {
       var binaryString = "";

       stream.on('data', function(data) {
           for(var i=0;i<data.length;i++) {
                binaryString+=String.fromCharCode(data[i]);
           }                
       });

        stream.on('end', function(data) {
             console.log(binaryString);
             binaryString = "";
       });
    });
编辑:

在客户端上,您应该能够像这样读取流:

var ss = require('socket.io-stream');
var stream = ss.createStream();

ss(socket).emit('blockchainOps', stream);
client.blockchain.getBlockStream().pipe(stream);
    <script src="socket.io/socket.io.js"></script>
    <script src="socket.io-stream.js"></script>
    ...
    ss(socket).on('blockchainOps', function(stream) {
       var binaryString = "";

       stream.on('data', function(data) {
           for(var i=0;i<data.length;i++) {
                binaryString+=String.fromCharCode(data[i]);
           }                
       });

        stream.on('end', function(data) {
             console.log(binaryString);
             binaryString = "";
       });
    });

...
ss(套接字).on('blockchainOps',函数(流){
var binaryString=“”;
stream.on('data',函数(data){

对于(var i=0;i,如果有人正在寻找工作socket.io流示例

//服务器端
const{pipeline}=require('stream')
const server=require('http').server().listen(8080)
常量io=require('socket.io')(服务器)
const ss=require('socket.io stream')
io.on('连接',(套接字)=>ss(套接字)。on('流',(流)=>{
管道(流,process.stdout,(err)=>err&&console.log(err))
}));
//客户端
const client=require('socket.io client')
const socket=client.connect('http://localhost:8080')
socket.on('connect',()=>{
const stream=ss.createStream()
ss(套接字).emit('stream',stream)
管道(process.stdin,stream,(err)=>err&&console.log(err))
});

如果有人正在寻找工作socket.io流示例

//服务器端
const{pipeline}=require('stream')
const server=require('http').server().listen(8080)
常量io=require('socket.io')(服务器)
const ss=require('socket.io stream')
io.on('连接',(套接字)=>ss(套接字)。on('流',(流)=>{
管道(流,process.stdout,(err)=>err&&console.log(err))
}));
//客户端
const client=require('socket.io client')
const socket=client.connect('http://localhost:8080')
socket.on('connect',()=>{
const stream=ss.createStream()
ss(套接字).emit('stream',stream)
管道(process.stdin,stream,(err)=>err&&console.log(err))
});

您的第一个示例不是我已经在做的吗?在您的第二个示例中,不是重复了吗?我无法获得getBlockStream()的管道结果进入套接字。它们用于不同的目的,socketio stream允许您传递流
socket.emit
,而
事件流
只是节点流的包装器。我已经更新了我的答案,您可以试试吗?请注意,您必须
将区块链流输送到通过
var stream=s创建的流s、 createStream();
Daniel,我愿意接受你的回答,但是我如何从这个IOStream对象中提取数据?我在这里找不到任何类似getBlockStream()结果的东西;我已经发布了一个示例,说明如何在浏览器中读取流,请记住您需要socketio流客户端
。您可以很容易地从cdn获取流。我将尝试一下。感谢您花时间查看。您的最佳示例不是我已经在做的吗?在您的第二个示例中,不是重复的吗?我一直无法获取getBlockStream()的管道结果进入套接字。它们用于不同的目的,socketio stream允许您传递流
socket.emit
,而
事件流
只是节点流的包装器。我已经更新了我的答案,您可以试试吗?请注意,您必须
将区块链流输送到通过
var stream=s创建的流s、 createStream();
Daniel,我愿意接受你的回答,但是我如何从这个IOStream对象中提取数据?我在这里找不到任何类似getBlockStream()结果的东西;我已经发布了一个如何在浏览器中读取流的示例,请记住,您需要socketio流客户端
。您可以从cdn轻松获取它。我将尝试一下。感谢您花时间查看此示例。