2011-05-23 244 views
3

我使用ws library为的WebSockets在Node.js和受 我试图从图书馆的例子这个例子:的Node.js的WebSocket广播

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); 

一切OK。它工作,但运行3个客户端,例如,并发送“你好!”从一个将使服务器只回复“谢谢!”给发送消息的客户,而不是全部。

如何播放“谢谢!”当有人发送“你好!”时所有连接的客户端?

谢谢!

回答

3

我建议你使用socket.io。它具有开箱即用的示例网络聊天功能,还提供客户端套接字技术的抽象层(WebSocket由Safari,Chrome,Opera和Firefox支持,但由于ws协议中的安全漏洞,现在在Firefox和Opera中被禁用)。

+1

感谢您的建议,回答,但我认为1年后(+/-)所有浏览器的支持WebSocket的。 :-) – vhyea 2011-05-23 14:22:26

+0

Chrome和Firefox r支持Websockets(尽管在FF中默认禁用) – Matt 2011-05-23 14:33:33

+0

@Matt编辑了答案的文本。 – bjornd 2011-05-23 14:38:03

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秒关闭是什么,所以我评论它。如果您试图向所有客户进行广播,因为它们会一直断开连接,这是毫无用处的。

+0

onteria_,非常感谢!工作!我开始了! :-) 谢谢(和所有其他的谢谢你的答案),祝你好运! – vhyea 2011-05-23 15:04:29