在Node.js中模拟服务器-流分隔文件,暂停1秒

在Node.js中模拟服务器-流分隔文件,暂停1秒,node.js,testing,stream,Node.js,Testing,Stream,我是Node.js的新手,正在编写一个客户端来使用来自服务器的基于文本的TCP流。出于测试目的,我希望在节点中模拟服务器,以便在没有其他依赖项的情况下进行测试 我有一个捕获数据的文件,看起来像: $X,... <-- broadcast every second $A,... $A,... $B,... $X,... <-- broadcast every second $A,... $A,... $C,... $X,... <-- broadcast every sec

我是Node.js的新手,正在编写一个客户端来使用来自服务器的基于文本的TCP流。出于测试目的,我希望在节点中模拟服务器,以便在没有其他依赖项的情况下进行测试

我有一个捕获数据的文件,看起来像:

$X,... <-- broadcast every second 
$A,...
$A,...
$B,...
$X,... <-- broadcast every second 
$A,...
$A,...
$C,...
$X,...  <-- broadcast every second 
这是可行的,但显然只是以扭曲速度输出整个文件。我想要的是从一个$X到下一个$X吐出所有行,暂停一秒钟(足够接近测试目的),然后继续到下一个$X,以此类推:

> telnet 127.0.0.1 8000
$X,... 
$A,...
$A,...
$B,...

(output would pause for one second)

$X,...
$A,...
$A,...
$C,...

(output would pause for one second)

$X,...
...
在我上面的示例中,当我连接客户端时,广播总是从data.txt的开头开始。理想情况下,此服务器将保持在循环中广播此数据,允许客户端随时断开和重新连接,并在服务器模拟器当前所在的位置开始接收数据

(PS-data.txt是一个相对较小的文件,在大多数情况下小于1MB)

更新-

多亏了Laurent的指针,我能够让它与以下各项一起工作:

var net = require('net'),
     fs = require('fs'),
     async = require('async');

var server = net.createServer(function (socket) {
  var lines = fs.readFileSync(__dirname + '/data-small.txt').toString().split(/\n+/);

  async.whilst(
    function () {
      return lines.length > 0;
    },
    function (done) {
        var line = lines.shift();
        socket.write(line + '\r\n');
        setTimeout(done, /^\$X,/.test(line) ? 1000 : 0);
      },
    function (err) {
      // no more lines present
      socket.end();
    });
});

server.listen(8000);
console.log('server running on 8000');
我现在得到一个爆炸线,直到一个$X,一个1s暂停,然后它继续!谢谢


深入到我的第二部分:是否有一种方法可以同步这个人造服务器的输出,以便所有客户端无论何时连接都可以看到相同的输出

如果你想让所有客户端保持同步,你需要做一些完全不同的事情。这是一个起点。此外,该模块似乎更适合

var net = require('net'), fs = require('fs'), _ = require('underscore'); var current = 0, sockets = []; // dirty parser for blocs var data = fs.readFileSync(__dirname + '/data.txt').toString(), blocs = _.chain(data.split(/\$X,/)).compact().map(function (bloc) { return '$X,' + bloc; }).value(); function streamBloc() { console.log('writing bloc #' + current + ' to ' + sockets.length + ' sockets'); _(sockets).each(function (socket) { socket.write(blocs[current]); }); current = (current + 1) % blocs.length; setTimeout(streamBloc, 1000); } var server = net.createServer(function (socket) { console.log('incoming connection'); // immediately write current bloc socket.write(blocs[current]); // add to sockets so that it receive future blocs sockets.push(socket); // cleanup when the client leaves socket.on('end', function () { sockets = _(sockets).without(socket); }); }).listen(8000, function () { console.log('server listening on port 8000'); }); streamBloc(); var net=要求('net'), fs=需要('fs'), _=要求('下划线'); 无功电流=0, 套接字=[]; //blocs的脏解析器 var data=fs.readFileSync(_dirname+'/data.txt').toString(), blocs=\.chain(data.split(/\$X,/).compact().map(函数(bloc){ 返回“$X”+集团; }).value(); 函数streamBloc(){ log('writing bloc#'+current+'到'+sockets.length+'sockets'); _(插座)。每个功能(插座){ socket.write(blocs[current]); }); 当前=(当前+1)%blocs.length; setTimeout(streamBloc,1000); } var server=net.createServer(函数(套接字){ log(“传入连接”); //立即写入当前组 socket.write(blocs[current]); //添加到套接字,以便接收将来的bloc 插座。推(插座); //客户端离开时进行清理 socket.on('end',function(){ 插座=(插座).无插座(插座);; }); }).听(8000,函数(){ log('server监听端口8000'); }); streamBloc();
谢谢Laurent!它几乎可以工作,但当我连接时,它会发出整个文件内容和错误,在服务器上没有“拆分”方法。(C:\Users\brian\Documents\workspace\node test\rmonitor.js:125:56)在Server.EventEmitter.emit(events.js:98:17)在HTTPParser.parser.onIncoming(http.js:2027:12)在HTTPParser.parserOnHeadersComplete[作为onHeadersComplete](http.js:119:23)在Socket.Socket.ondata(http.js:1917:22)在TCP.onread(net.js:510:27)上“我认为这很简单:readFileSync返回一个缓冲区,首先需要用.toString()转换。您能用更新的代码再试一次吗? var net = require('net'), fs = require('fs'), _ = require('underscore'); var current = 0, sockets = []; // dirty parser for blocs var data = fs.readFileSync(__dirname + '/data.txt').toString(), blocs = _.chain(data.split(/\$X,/)).compact().map(function (bloc) { return '$X,' + bloc; }).value(); function streamBloc() { console.log('writing bloc #' + current + ' to ' + sockets.length + ' sockets'); _(sockets).each(function (socket) { socket.write(blocs[current]); }); current = (current + 1) % blocs.length; setTimeout(streamBloc, 1000); } var server = net.createServer(function (socket) { console.log('incoming connection'); // immediately write current bloc socket.write(blocs[current]); // add to sockets so that it receive future blocs sockets.push(socket); // cleanup when the client leaves socket.on('end', function () { sockets = _(sockets).without(socket); }); }).listen(8000, function () { console.log('server listening on port 8000'); }); streamBloc();