当前位置: 首页 > 面试题库 >

使用Node.js传输数据

潘高岑
2023-03-14
问题内容

我想知道是否可以使用Node.js将数据从服务器流式传输到客户端。我想将单个AJAX请求发布到Node.js,然后将连接保持打开状态并将数据连续流式传输到客户端。客户端将收到此流并不断更新页面。

更新:

更新-我无法使其正常工作。在response.write你打电话之前不发送close。我建立了一个示例程序来实现此目的:

Node.js:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' + 
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds()
        );
    },1000);
}).listen(8000);

HTML:

<html>
    <head>
        <title>Testnode</title>
    </head>

    <body>
        <!-- This fields needs to be updated -->
        Server time: <span id="time">&nbsp;</span>

        <!-- import jQuery from google -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

        <!-- import jQuery -->
        <script type="text/javascript">
            $(document).ready(function(){
            // I call here node.localhost nginx ports this to port 8000
                $('#time').load('http://node.localhost');
            });
        </script>
    </body>
</html>

使用这种方法,我打电话之前什么都没拿回来close()。这是否可能,或者我应该使用长轮询方法,而不是在进来时再次调用load函数?


问题答案:

有可能的。只需多次使用response.write()。

var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];
// send headers
response.writeHead(200, {
  "Content-Type": "text/plain"
});

// send data in chunks
for (piece in body) {
    response.write(body[piece], "ascii");
}

// close connection
response.end();

您可能必须每隔30秒左右关闭并重新打开一次连接。

编辑 :这是我实际测试的代码:

var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    sys.puts('Starting sending time');
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' +
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds() + "\n"
        );

        setTimeout(function() {
            res.end();
        }, 10000);

    },1000);
}).listen(8090, '192.168.175.128');

我通过Telnet连接到它,它确实发出了分块的响应。但是要在AJAX浏览器中使用它,必须支持XHR.readyState =3(部分响应)。据我所知,并非所有浏览器都支持此功能。因此,最好使用长时间轮询(或针对Chrome / Firefox的Websockets)。

EDIT2 :另外,如果您使用nginx作为Node的反向代理,它有时会希望收集所有块并将其立即发送给用户。您需要对其进行调整。



 类似资料:
  • 问题内容: 我一直在寻找如何将MongoDB查询结果流式传输到nodejs客户端的示例。到目前为止,我发现的所有解决方案似乎都是立即读取查询结果,然后将结果发送回服务器。 相反,我(显然)想为查询方法提供一个回调,并在结果集的下一个块可用时让MongoDB调用它。 我一直在看猫鼬-我是否应该使用其他驱动程序? 一月 问题答案: 在Mongoose中进行流式处理的版本为2.4.0,该版本在发布此问题

  • 问题内容: 我在Node.js中使用流服务器来流MP3文件。虽然可以流式传输整个文件,但我不能使用标题将文件流式传输到起始位置并使用终止位置。 我使用like 从秒计算开始和结束字节 在这种情况下,这将为我提供从10秒到下一个第一个数据包的确切字节。 这在Node.js中变得如此简单 现在我有了开始和结束字节,我的媒体服务器将以这种方式从传递给它的自定义值中获取范围 此时,我将获得这个范围, 因此

  • 问题内容: 该代码是否有效的HTTP / 1.1? 我认为我在这里违反HTTP / 1.1?文本文件似乎确实可以正常工作,但这可能是偶然的。我的标题是“ 200 OK”还是需要为“ 100”?一个头足够吗? 问题答案: 如果要进行分块传输编码,则实际上需要设置该标头: 您可以从google返回的标头中看到该标头,该标头会对主页以及最可能的其他页面进行分块传输: 编辑 Yikes,读起来太复杂了:

  • 主要内容:创建 gob 文件,读取 gob 文件为了让某个 数据结构能够在网络上传输或能够保存至文件,它必须被编码然后再解码。当然已经有许多可用的编码方式了,比如  JSON、 XML、Google 的 protocol buffers 等等。而现在又多了一种,由Go语言 encoding/gob 包提供的方式。 Gob 是Go语言自己以二进制形式序列化和反序列化程序数据的格式,可以在 encoding 包中找到。这种格式的数据简称为 Gob(

  • 问题内容: 我正在尝试设置一个网络服务器,该服务器将使用node.js将视频流传输到HTML5视频标签。到目前为止,这是我的代码: 其中“ request”代表http请求,类​​型是“ application / ogg”或“ video / ogg”(我都尝试过),而“ file”是已从文件系统读取的.ogv文件。这是响应头: 我已经检查了响应头,并且此代码似乎运行良好,但是存在两个问题: 该

  • Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。类似于 Python 的 "pickle" 和 Java 的 "Serialization"。 Gob 通常用于远程方法调用(RPCs,参见 15.9 的 rpc 包)参数和结果的传输,以及应用程序和机器之间的数据传输。 它和 J