【问题标题】:Socket.IO - How to figure out who disconnected?Socket.IO - 如何确定谁断开了连接?
【发布时间】:2013-04-25 16:30:05
【问题描述】:

我正在使用前端的 HTML5 和 Javascript 以及后端的 Node.js 构建简单的 Web 应用程序。我还使用 Socket.IO 在客户端和服务器之间来回传递数据。假设我有一个聊天页面,每个人都在其中登录并加入聊天室。我跟踪后端聊天室中的所有人。我想要做的是如果一个人离开那个房间,就把他们从房间里移走。例如,假设某人关闭了浏览器,他们不应再显示为活跃用户。

Socket.IO 有一个断开事件,这似乎是执行此操作的完美工具。例如当我运行这段代码时:

socket.on("disconnect", function (){
  console.log("DISCONNECTED");
});

当有人关闭浏览器时,将打印“DISCONNECTED”。现在我的问题是,我怎么知道到底是谁关闭了那个浏览器?没有数据传递给断开事件,所以我不确定我应该如何检查谁触发了断开事件。任何帮助将不胜感激!

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    基本上,一旦您侦听了“连接”事件,每当客户端连接到服务器时,您都会得到一个套接字对象。 您可以将客户端信息存储到该套接字对象。 你可以参考这篇文章,并注意服务器端的代码,其中编码器在服务器端使用 pluarl form 'sockets'(所以服务器端会创建许多客户端套接字!)。 http://psitsmike.com/2011/10/node-js-and-socket-io-multiroom-chat-tutorial/

    希望以下示例对您有所帮助。

    //server side
    var io = require('socket.io').listen(80)
    // sockets here, not socket
    io.sockets.on('connection', function(socket){
      // every connection will create a socket
      socket.on('newUser', function(name){
        socket.id = name; // socket stores the username
      });
      socket.on('disconnect', function(){
        console.log(socket.id); // retrieve it from socket object
      });
      // more functionality goes...
    });
    

    和客户端

    var socket = io.connect('http://localhost:80');
    socket.on('connect', function(){
       //emit newUser event so that client info is stored
      socket.emit('newUser', prompt('Please enter your name!'));
      //.... more functionality goes
    });
    

    希望这能帮助你理解!

    【讨论】:

    • 这正是我想要的,谢谢!我发现 socket.IO 的文档缺乏并且难以浏览。我从来不知道服务器端有一个“连接”事件,即使我认为应该存在。
    • 注意 - 我会改用 socket.userName 而不是 socket.id,因为 id 已经用于存储套接字 ID。
    【解决方案2】:

    你可以这样做:

    socket.on("disconnect", function (){
      console.log(this.id); // this.id is the 'id' of the socket that got disconnected
    });
    

    【讨论】:

      【解决方案3】:

      你的问题毫无意义。每个套接字都是到单个客户端的连接。

      以下是如何将名称与套接字关联,然后在同一个套接字断开连接时打印相同的名称:

      io.sockets.on('connection', function(socket) {
          var name = "";
          socket.on('set-name', function(_name) {
              name = _name;
          });
          socket.on("disconnect", function (){
              console.log("DISCONNECTED "+name);
          });
      });
      

      你已经知道哪个连接丢失了,因为你持有连接对象socket

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 2017-07-17
        • 2016-07-08
        • 1970-01-01
        相关资源
        最近更新 更多