4

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

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

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

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

4

3 回答 3

5

基本上,一旦您侦听了“连接”事件,每当客户端连接到服务器时,您都会得到一个套接字对象。您可以将客户端信息存储到该套接字对象。你可以参考这篇文章,并注意服务端代码,其中编码器在服务端使用 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
});

希望这能帮助你理解!

于 2013-04-25T08:30:05.397 回答
4

你可以这样做:

socket.on("disconnect", function (){
  console.log(this.id); // this.id is the 'id' of the socket that got disconnected
});
于 2013-04-25T07:41:42.197 回答
1

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

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

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

于 2013-04-25T07:44:51.060 回答