Les données en continu avec Node.js
Je veux savoir si il est possible de transférer des données à partir du serveur vers le client avec Node.js. Je veux mettre une seule requête AJAX Node.js puis laisser la connexion ouverte et continu de flux de données pour le client. Le client recevra de ce flux et de mise à jour de la page en permanence.
Mise à jour:
Une mise à jour de cette réponse - je ne peux pas obtenir que cela fonctionne. Le response.write
n'est pas envoyé avant d'appeler close
. J'ai mis en place un exemple de programme que j'utilise pour réaliser ceci:
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>
À l'aide de cette méthode, je n'obtenez pas quelque chose de nouveau, jusqu'à ce que j'appelle close()
. Est-ce possible ou dois-je aller avec un long sondage approche à la place où j'appelle la fonction de charge de nouveau comme l'un vient vous?
- Aussi je ne pense pas que ce soit le streaming, c'est juste de la segmentation des trucs en bits. Oui, noeud envoie des éléments de réponse, mais chaque serveur html ne ce. Le streaming de la bonté que vous obtenez de nœud se réfère à quelque chose d'autre.
- Aussi, dans votre exemple, vous n'avez pas le mettre en pause, reprendre, rincer méthodes. Le (lire) flux est quelque chose qui est en vous donnant des données, aussi vite qu'il le peut (ou aussi vite que vous le pouvez). Et vous lui dites de faire une pause, puis il s'arrête. Et de vous dire de continuer etc.
Vous devez vous connecter pour publier un commentaire.
C'est possible. Utilisez simplement réponse.écrire() plusieurs fois.
Vous pourriez avoir à fermer et rouvrir la connexion toutes les 30 secondes.
MODIFIER: c'est le code que j'ai réellement testé:
Je suis connecté en Telnet et son effet donne des fragments de réponse. Mais pour l'utiliser en AJAX navigateur doit prendre en charge XHR.readyState = 3 (réponse partielle). Pas tous les navigateurs prennent en charge ce, pour autant que je sais. Afin de mieux utiliser le temps d'interrogation (ou les Websockets pour Chrome/Firefox).
EDIT2: Aussi, si vous utilisez nginx comme serveur proxy inverse pour le Nœud, il veut parfois de rassembler tous les morceaux et de les envoyer à l'utilisateur à la fois. Vous avez besoin de ruser.
jquery.load
attend tous corps d'arriver avant la mise à feu de rappel. Vous avez besoin d'utiliser quelque chose de différent. Voir api.jquery.com/loadXMLHTTPRequest
peut-être. Tout ce qui peut traiter avec des fragments de réponses.response.close
une fonction? Je crois que tu veux direresponse.end
: nodejs.org/api/http.html#http_response_end_data_encodingRegarder les Sockets.io. Il fournit HTTP/HTTPS en streaming et utilise différents transports pour le faire:
Et! Il fonctionne de manière transparente avec Node.JS. C'est aussi un mécanisme national de prévention de package.
https://github.com/LearnBoost/Socket.IO
https://github.com/LearnBoost/Socket.IO-node
Vous pouvez également annuler la boucle infinie:
Ceci est un exemple de expressjs. Je crois que sans expressjs sera quelque chose comme.