Najlepiej użyć po prostu WebSockets
, ale alternatywą jest długotrwałe sondowanie ajax.
Do wykonania czatu można użyć techniki zwanej długim sondowaniem. Oznacza to, że wysyłasz zapytanie (ajax) do serwera, a serwer przechowuje to żądanie, dopóki nie pozostawi pewnych danych do wysłania.
Tak więc klienci kończą cyklicznie odpytywanie serwera, jeśli serwer nie ma nowych wiadomości, po prostu wstrzymuje żądanie. Jeśli ma wiadomość, wysyła ją z powrotem do klienta, a klient ponownie odpytuje serwer.
[[Kod Pseudo]]
// Client.js
var Socket = function(ip, port, name) {
this.ip = ip;
this.port = port;
this.name = name;
this._cbs = [];
this._poll();
};
// Call the server periodically for data.
Socket.prototype._poll = function() {
var that = this;
// if the server does not return then call it again
var timer = setTimeout(function() {
this._poll();
}, 5000);
$.ajax({
type: "GET",
timeout: 5000,
data: {
name: this.name
},
url: this.ip + ":" + this.port,
success: function(data) {
// server returned, kill the timer.
clearTimeout(timer);
// send the message to the callback.
for (var i = 0; i < that._cbs.length; i++) {
that._cbs[i](data);
}
// call the server again
that._poll();
}
});
};
// Add a callback for a message event
Socket.prototype.on = function(event, cb) {
if (event === "message") {
this._cbs.push(cb);
}
};
// Send a message to the server
Socket.prototype.send = function(message) {
$.ajax({
data: {
message: message,
name: this.name
},
type: "GET",
url: this.ip + ":" + this.port
});
};
var socket = new Socket('192.168.1.1', '8081', "Raynos");
socket.on("message", function(data) {
console.log(data);
});
socket.send("Hello world!");
// server.js
var url = require("url");
var events = require("events");
// store messages for clients
var clients = {};
var emitter = new events.EventEmitter();
http.createServer(function(req, res) {
// get query string data
var data = url.parse(req.url, true).query;
// if client is not initialized then initialize it.
if (data.name && !clients[data.name]) {
clients[data.name] = [];
}
// if you posted a message then add it to all arrays
if (data.message) {
for (var k in clients) {
clients[k].push(data.name + " : " + data.message);
}
// tell long pollers to flush new data.
emitter.emit("new-data");
} else if (clients[data.name].length > 0) {
// else empty the clients array down the stream
for (var i = 0; i < clients[data.name].length; i++) {
res.write(clients[data.name].shift());
};
res.end();
// long polling magic.
} else {
var cb = function() {
for (var i = 0; i < clients[data.name].length; i++) {
res.write(clients[data.name].shift());
};
res.end();
// kill that timer for the response timing out.
clearTimeout(timer);
}
// when we get data flush it to client
emitter.once("new-data", cb);
var timer = setTimeout(function() {
// too long has passed so remove listener and end response.
emitter.removeListener(cb);
res.end();
}, 4500);
}
}).listen(8081);
Lepsza technologia Push byłoby Server-side events. Zobacz example of it here. Nie wymaga to jednak obsługi przeglądarki (wydaje mi się, że to Chrome i opera).
, ale pytanie brzmi, w jaki sposób wiadomość jest wysyłana do klienta?dziękuję za redis, wygląda to interesująco, ale nie odnosi się do 'node.js' :), ale jako programista PHP wygląda to interesująco – Adam
Po prostu, jeśli klient zasubskrybuje usługę, tworzona jest kolejka do przechowywania wszelkie wiadomości wysłane przez innych klientów. Gdy klient wysyła wiadomość, jest dodawany do każdej kolejki pozostałych subskrybentów. Następnie klient żąda wiadomości oczekujących, które zostały dodane do własnej kolejki. –
Websockets (funkcja HTML5) pozwala klientowi otworzyć dwukierunkowe gniazdo do serwera WWW, którego serwer może użyć do "wypychania" wiadomości do klienta. W przypadku braku tej funkcji klienci odpytują serwer (za pośrednictwem AJAX) o wszelkie oczekujące wiadomości. Serwer nie przesyła wiadomości (ponieważ nie ma w nich sieci web), ale nie ma natywnej możliwości. Właśnie dlatego socket.io jest tak przydatny. Jeśli klient obsługuje strony internetowe, używa ich. Jeśli nie, próbuje wielu innych środków, które powracają do długiego głosowania. –