我在Node.js中使用ws library用于WebSockets 我正在从库示例中尝试这个例子:
var sys = require("sys"),
ws = require("./ws");
ws.createServer(function (websocket) {
websocket.addListener("connect", function (resource) {
// emitted after handshake
sys.debug("connect: " + resource);
// server closes connection after 10s, will also get "close" event
setTimeout(websocket.end, 10 * 1000);
}).addListener("data", function (data) {
// handle incoming data
sys.debug(data);
// send data to client
websocket.write("Thanks!");
}).addListener("close", function () {
// emitted when server or client closes connection
sys.debug("close");
});
}).listen(8080);
一切都好。它可以工作,但是运行3个客户端,然后发送“Hello!”从一个将使服务器只回复“谢谢!”发送消息的客户端,而不是全部。
如何广播“谢谢!”当有人发送“你好!”时,所有连接的客户端?
谢谢!
答案 0 :(得分:8)
如果您想发送给所有客户,您必须跟踪它们。这是一个示例:
var sys = require("sys"),
ws = require("./ws");
// # Keep track of all our clients
var clients = [];
ws.createServer(function (websocket) {
websocket.addListener("connect", function (resource) {
// emitted after handshake
sys.debug("connect: " + resource);
// # Add to our list of clients
clients.push(websocket);
// server closes connection after 10s, will also get "close" event
// setTimeout(websocket.end, 10 * 1000);
}).addListener("data", function (data) {
// handle incoming data
sys.debug(data);
// send data to client
// # Write out to all our clients
for(var i = 0; i < clients.length; i++) {
clients[i].write("Thanks!");
}
}).addListener("close", function () {
// emitted when server or client closes connection
sys.debug("close");
for(var i = 0; i < clients.length; i++) {
// # Remove from our connections list so we don't send
// # to a dead socket
if(clients[i] == websocket) {
clients.splice(i);
break;
}
}
});
}).listen(8080);
我能够将它广播给所有客户,但并未对所有情况进行严格测试。一般的概念应该让你开始。
编辑:顺便说一下,我不确定10秒关闭是什么,所以我已经评论过了。如果您尝试向所有客户广播,那将毫无用处,因为他们将继续断开连接。
答案 1 :(得分:3)
我建议你使用socket.io。它具有开箱即用的示例网络聊天功能,还提供客户端上的套接字技术的抽象层(Safari,Chrome,Opera和Firefox支持WebSockets,但由于ws-protocol中的安全漏洞,现在在Firefox和Opera中禁用)。