les données de diffusion en continu avec Node.js
-
23-09-2019 - |
Question
Je veux savoir s'il est possible de diffuser des données à partir du serveur au client avec Node.js. Je veux poster une requête AJAX seule à Node.js, puis laisser la connexion ouverte et flux continu des données au client. Le client recevra ce flux et mettre à jour la page en continu.
Mise à jour:
En tant que mise à jour href="https://stackoverflow.com/questions/2558606/stream-data-with-node-js/2563459#2563459"> - Je ne peux pas obtenir ce travailler. Le response.write
n'est pas envoyé avant d'appeler close
. Je l'ai mis en place un programme d'exemple que j'utiliser pour y parvenir:
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>
En utilisant cette méthode, je ne reçois rien de nouveau jusqu'à ce que j'appelle close()
. Est-ce possible ou devrais-je aller avec une longue approche de sondage au lieu où je l'appelle à nouveau la fonction de charge comme on arrive?
La solution
Il est possible. Il suffit d'utiliser response.write () plusieurs fois.
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();
Vous devrez peut-être fermer et rouvrir toutes les 30 secondes de connexion ou ainsi.
EDIT : c'est le code que j'ai testé:
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');
Je relié par Telnet et son donne en effet sur la réponse chunked. Mais pour l'utiliser dans le navigateur AJAX doit supporter XHR.readyState = 3 (réponse partielle). Tous les navigateurs prennent en charge ce, pour autant que je sache. Vous utilisez donc plus longue interrogation (ou Websockets pour Chrome / Firefox).
EDIT2 : En outre, si vous utilisez nginx comme proxy inverse nœud, il veut parfois rassembler tous les morceaux et l'envoyer à l'utilisateur à la fois. Vous avez besoin de ruser.
Autres conseils
Regardez Sockets.io. Il fournit HTTP / HTTPS streaming et utilise divers moyens de transport pour le faire:
- WebSocket
- WebSocket sur flash (+ de soutien à la politique de sécurité XML)
- XHR Polling
- XHR multipart streaming
- Pour toujours Iframe
- JSONP scrutin (pour plusieurs domaines)
! Il fonctionne parfaitement avec Node.js. Il est également un ensemble de NPM.
Vous pouvez également interrompre la boucle infinie:
app.get('/sse/events', function(req, res) {
res.header('Content-Type', 'text/event-stream');
var interval_id = setInterval(function() {
res.write("some data");
}, 50);
req.socket.on('close', function() {
clearInterval(interval_id);
});
});
Ceci est un exemple de express.js. Je crois que sans express.js sera quelque chose comme.