【问题标题】:Node.js WebSocket BroadcastNode.js WebSocket 广播
【发布时间】:2014-07-18 22:46:18
【问题描述】:

我在 Node.js 和 WebSockets 中使用 ws library 我正在从库示例中尝试这个示例:

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!”时向所有连接的客户端发送?

谢谢!

【问题讨论】:

    标签: javascript node.js websocket


    【解决方案1】:

    如果您想发送给所有客户,您必须跟踪他们。这是一个示例:

    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_,非常感谢!工作!我开始了! :-) 谢谢(以及所有其他人的回答),祝你好运!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的推荐和回答,但我认为在 1 年后(+/-)所有浏览器的支持 WebSocket 的。 :-)
    • Chrome 和 Firefox r 支持 Websockets(尽管在 FF 中默认禁用)
    • @Matt 编辑了答案文本。
    • @vhyea:只是为了澄清@bjornd 的答案。 Socket.IO 是一个抽象通信的客户端和服务器库。如果 WebSockets 可用,那么 Socket.IO 将使用它。如果 Flash 可用,那么 Socket.IO 可以使用web-socket-js,这是一个基于 Flash 的 WebSockets fallback/shim/polyfill。如果两者都不可用,则 Socket.IO 使用较慢的长轮询方法。换句话说,Socket.IO 抽象了底层传输。
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 2017-05-26
    • 2021-03-31
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多