Node.js WebSocket 广播

3

我正在使用Node.js中的ws库进行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个客户端连接并从其中一个发送“你好!”消息,服务器只会回复发送该消息的客户端,而不会回复所有客户端。

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

谢谢!

2个回答

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秒钟的关闭是干什么用的,所以我把它注释掉了。如果你试图向所有客户端广播信息,那就没什么用处,因为他们只会不断地断开连接。

onteria_,非常感谢!工作愉快!我开始了!:-)谢谢(以及其他人的感谢答案),祝好运! - vhyea

2
我建议您使用socket.io。它具有示例Web聊天功能,并提供了客户端套接字技术的抽象层(WebSockets由Safari、Chrome、Opera和Firefox支持,但现在由于ws协议中的安全漏洞而在Firefox和Opera中被禁用)。

1
感谢您的推荐和回答,但我认为在1年左右的时间内,所有浏览器都会支持WebSocket。 :-) - vhyea
Websockets在Chrome和Firefox中得到支持(尽管在FF中默认情况下被禁用)。 - Matt
@Matt 编辑了答案的文本。 - bjornd
@vhyea:只是为了澄清@bjornd的回答。Socket.IO是一个客户端和服务器库,用于抽象通信。如果WebSockets可用,则Socket.IO将使用它。如果Flash可用,则Socket.IO可以使用web-socket-js,这是一个基于Flash的WebSockets备用/填充程序/多功能工具。如果两者都不可用,则Socket.IO使用较慢的长轮询方法。换句话说,Socket.IO抽象了底层传输。 - kanaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接