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