Node.js WebSocket广播

时间:2011-05-23 14:06:57

标签: javascript node.js websocket

我在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!”从一个将使服务器只回复“谢谢!”发送消息的客户端,而不是全部。

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

谢谢!

2 个答案:

答案 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中禁用)。