Node.js 如何通过socket.io将数据流传输到客户端
我让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 =
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轻松获取它。我将尝试一下。感谢您花时间查看此示例。