Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.IO-如何确定谁断开了连接?_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript Socket.IO-如何确定谁断开了连接?

Javascript Socket.IO-如何确定谁断开了连接?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正在构建一个简单的web应用程序,前端使用HTML5和Javascript,后端使用Node.js。我还使用Socket.IO在客户端和服务器之间来回传递数据。假设我有一个聊天页面,每个人都登录并加入聊天室。我在后台跟踪聊天室里的所有人。我想做的是,如果一个人离开房间,就把他从房间里带走。例如,如果某人关闭了浏览器,则他们不应再显示为活动用户 IO有一个断开连接事件,它似乎是实现这一点的完美工具。例如,当我运行此代码时: socket.on("disconnect", function (){

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

IO有一个断开连接事件,它似乎是实现这一点的完美工具。例如,当我运行此代码时:

socket.on("disconnect", function (){
  console.log("DISCONNECTED");
});
当某人关闭浏览器时,将打印“已断开连接”。现在我的问题是,我怎么知道到底是谁关闭了浏览器?没有数据被传递到断开连接事件,因此我不确定应该如何准确地检查谁触发了断开连接事件。任何帮助都将不胜感激

你可以做:

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

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

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

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

基本上,一旦您侦听了“connect”事件,每当客户端连接到服务器时,您都会得到一个socket对象。 您可以将客户机信息存储到该套接字对象。 您可以参考本文,并注意服务器端代码,其中编码人员在服务器端使用pluarl形式的“sockets”(因此服务器端将创建许多客户端socket!)。

希望下面的示例将对您有所帮助

//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
已经用于存储socket-id。