Ada*_*dam 9 javascript sockets chat comet node.js
使用TCP的Net Stream对象工作得很好(如node.js介绍视频中的presetend ),但我应该如何在HTTP中执行此操作?
有没有办法访问套接字/客户端http.createServer()?或者方法是什么?我试图从官方节点聊天演示 源代码中找出解决方案,但我真的不明白.
我理解客户端js,但是在我(作为客户端)通过AJAX向服务器端js发送消息之后发生了什么?如何发送给服务器上的其他客户端呢?
请注意,我不想学习该过程的逻辑,所以我不想使用socket.io或任何其他框架,库,模块.
非常感谢您的帮助!
Ray*_*nos 10
理想情况下,你只是使用,WebSockets但替代方案是ajax长轮询.
您可以使用称为长轮询的技术来进行聊天.这意味着您向服务器发出(ajax)请求,并且服务器保留此请求,直到它有一些数据要发送.
因此,客户端最终会定期轮询服务器,如果服务器没有新的消息,它只会保留您的请求.如果它有消息,则将其发送回客户端,客户端将再次轮询服务器.
[[伪代码]]
// 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!");
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
更好的推送技术将是服务器端事件.在这里查看它的一个例子.这确实需要浏览器支持(我认为Chrome和Opera).
一种方法是客户端“订阅”充当消息分发者的通道。订阅后,客户端就会收到发送到频道的每条消息的副本。
许多节点聊天服务依赖于 Redis 的 pubsub 功能来处理从一个客户端到任意数量客户端的消息分发。如果您想“自己动手”,那么了解 Redis 如何解决这个问题将是一个很好的开始。
| 归档时间: |
|
| 查看次数: |
8026 次 |
| 最近记录: |