gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:56:18 25 4
gpt4 key购买 nike

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

我有一个捕获数据的文件,如下所示:

$X,... <-- broadcast every second 
$A,...
$A,...
$B,...
$X,... <-- broadcast every second
$A,...
$A,...
$C,...
$X,... <-- broadcast every second

服务器每秒发出一行以 $X 开头的行。其他记录在事件发生时广播。我如何修改下面的网络服务器以广播此数据并限制它,以便它一次发出一行并在每次遇到以 $X 开头的行时暂停一秒钟?

到目前为止,这是我的代码,它读取数据并通过端口广播:

 var http = require('http')
, fs = require('fs')
;
var server = http.createServer(function (req, res) {
var stream = fs.createReadStream(__dirname + '/data.txt');
stream.pipe(res);
});
server.listen(8000);
console.log('server running on 8000');

这行得通,但显然只是以极快的速度流出整个文件。我想要的是吐出从一个 $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,停顿 1 秒,然后继续!谢谢!

深入探讨我的第二部分:有没有一种方法可以同步这个虚假服务器的输出,以便所有客户端无论何时连接都能看到相同的输出?

最佳答案

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

var net = require('net'),    fs = require('fs'),    _ = require('underscore');var current = 0,    sockets = [];// dirty parser for blocsvar 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();

关于node.js - 在 Node.js 中模拟服务器 - 流分隔文件,暂停 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com