微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jquery – 使用Node.js流式传输数据

我想知道是否可以使用Node.js将数据从服务器流式传输到客户端。从我可以理解的所有在互联网上,这是必须是可能的,但我没有找到一个正确的例子或解决方案。

我想要的是一个单独的http post到node.js与AJAX。比离开连接打开和连续流数据到客户端。

客户端将接收此流并不断更新页面

Update 1

作为此答案的更新:Stream data with Node.js

我试过这个已经,我尝试了你的分析器后再次。我不能让这个工作。在您调用close之前response.write不发送。我设置了一个示例程序,我用来实现这一点。

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()。这是可能的,或者我应该宁愿去一个长轮询的方法,我再次调用加载函数作为一个进来。

我真的很想流。我希望有人可以帮助。

解决方法

有可能的。只需使用 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'),{'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(部分响应)。并不是所有的浏览器都支持这个,据我所知。所以你最好使用长轮询(或WebSocket for Chrome / Firefox)。

EDIT2:另外,如果你使用Nginx作为Node的反向代理,它有时想要收集所有的块并立即发送给用户。你需要调整它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐