我想知道是否可以使用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"> </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