曾经试图花几天时间来不断读取数据,但仍未找到解决方案。实际上,我对此很不好。我正在使用套接字io进行实时数据更新。对于节点js,我的数据非常大,无法正常传输,因此我不得不分批传输数据。问题是套接字在第一次加载后停止更新新的json数据。第一次加载时数据更新良好。除非重新启动节点,否则块数据将停止传输。
这是我完整的服务器文件:
var EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(0)
var express = require('express');
var app = express();
var fs = require('fs');
var readableStream = fs.createReadStream('./edata.json')
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/xsite.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/xsite.com/fullchain.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/xsite.com/chain.pem')
};
var https = require('https').Server(options, app);
var zmq = require('zeromq')
, sock = zmq.socket('pull');
sock.bind('tcp://10.150.0.6:1111');
var io = require('socket.io')(https);
io.on('connection', function(socket){
socket.on('disconnect',function(){
console.log("client disconnected");
})
sock.on('message',function(chunk){
readableStream.on('data',chunk=>{
console.log("working emitter", chunk.toString())
socket.emit('latest_score',chunk.toString());
})
});
});
https.listen(1969);
sock.on('connect', function(fd, ep) {console.log('connect, endpoint:', ep);});
console.log('Server connected to port 1969');
如果这里有人可以建议我如何连续传输数据而不必重启节点。敬请谅解。
答案 0 :(得分:1)
您设计的事件处理方式可能是错误的。我将逐步解释您的设计。
readableStream
以流式传输文件。由于没有data
事件处理程序,因此它不会开始流动。因此,流最初在等待。sock
定义并初始化为Zeromq套接字。io.on('connection', ...)
侦听器,以便在传入socket.io连接时得到通知。io.on('connection', ...)
内,您执行sock.on('message', function(chunk){{...});
,这将为您在zeromq套接字上传入message
事件的监听器。readableStream.on('data',chunk=>{ socket.emit(...)});
。因此,这是data
上的第一个readableStream
事件侦听器,因此它将开始流的流动,您将获得一系列data
事件,并将这些事件发送到套接字。 io套接字。readableStream
数据将全部流过,并将所有数据发送到socket.io套接字上。 readableStream
中的所有内容都已经发送完(流结束并结束)之后,另一个socket.io连接进来了。此时,您将再次等待zermomq消息。发生这种情况时,您将在data
上注册另一个readableStream
事件处理程序。但是,readyStream已经完成并关闭。它不再有data
个事件,因此第二个socket.io连接没有任何发送。message
侦听器在这里应该做什么,因为直到出现该消息之前,没有任何内容开始流向第一个socket.io连接。因此...如何解决此问题取决于您真正希望每个新的socket.io连接的行为如何。您将必须对此进行充分说明,并说明与zeromq消息有何关系,以便我们提出固定设计。但是,希望对现有代码的这种解释将解释为什么您看到自己的行为。
如果要将数据从可读流发送到每个新的socket.io连接,则必须为每个socket.io连接创建一个新的单独的可读流。我仍然不知道这与Zeromq有什么关系,为什么不开始任何操作,直到收到Zeromq消息,或者在流传输数据后再收到另一个Zeromq消息时,您会期望发生什么。