Nodejs websocket 聊天小软件的问题 内详

Nodejs websocket 聊天小软件的问题 内详

ws.on(‘close’, function(){ }); 用户失去连接的时候触发的时间

我如何获取用户信息?我想得到这个失去连接的用户信息 要如何去做 代码在下面

var clients = new Array(); var userList = []; var userId = 0; var idList = []; var uname; var t=0; wss.on(‘connection’, function(ws){
clients.push([ws,userId]); idList.push(userId); ++userId;

ws.on(‘message’, function(msg){

});

ws.on('close', function(){

});

晓得的帮帮忙 谢谢拉


5 回复

当然可以!你提到的问题主要是在用户断开连接时如何获取该用户的详细信息。以下是一个完整的示例代码,包括如何管理客户端连接、处理消息以及处理客户端关闭的情况。

首先,我们使用 ws 模块来创建 WebSocket 服务器。你需要确保已经安装了 ws 模块:

npm install ws

然后,你可以使用以下代码实现一个简单的 WebSocket 聊天服务器,并处理用户断开连接的情况:

const WebSocket = require('ws');

// 创建WebSocket服务器
const wss = new WebSocket.Server({ port: 8080 });

// 存储所有在线的客户端
let clients = [];

// 存储用户ID列表
let idList = [];

// 用户ID计数器
let userId = 0;

// 当有新的客户端连接时触发
wss.on('connection', function connection(ws) {
    // 生成唯一的用户ID
    const newUserId = userId++;
    
    // 将新客户端添加到在线列表中
    clients.push({ ws, id: newUserId });
    idList.push(newUserId);

    console.log(`New client connected with ID ${newUserId}`);

    // 处理客户端发送的消息
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        
        // 广播消息给所有其他客户端
        broadcast(message, ws);
    });

    // 当客户端断开连接时触发
    ws.on('close', function close() {
        console.log('Client disconnected');

        // 移除已断开连接的客户端
        clients = clients.filter(client => client.ws !== ws);
        idList = idList.filter(id => id !== newUserId);

        // 通知其他客户端当前用户已离线
        broadcast(`${newUserId} has left the chat`, ws);
    });
});

// 广播消息给所有其他客户端
function broadcast(message, sender) {
    clients.forEach(client => {
        if (client.ws !== sender) {
            client.ws.send(message);
        }
    });
}

解释

  1. 初始化

    • 我们创建了一个 WebSocket 服务器,并监听端口 8080
    • clients 数组用于存储所有连接的客户端对象。
    • idList 数组用于存储每个客户端的唯一标识符。
    • userId 是一个计数器,用于为每个新连接的客户端生成唯一的用户ID。
  2. 处理新连接

    • 每当有新的客户端连接时,我们将其添加到 clientsidList 中,并打印一条日志消息以确认新客户端已连接。
  3. 处理消息

    • 客户端发送的消息通过 ws.on('message') 处理,并打印消息内容。
    • 然后,我们调用 broadcast 函数将消息广播给所有其他客户端。
  4. 处理断开连接

    • 当客户端断开连接时,我们从 clientsidList 中移除该客户端。
    • 同时,我们调用 broadcast 函数通知其他客户端该用户已离开聊天室。

这样,你就可以在用户断开连接时获取并处理该用户的详细信息了。希望这对你有所帮助!


个人见解,你可以在connection事件的回调函数中增加几个变量,连接成功后用户的信息(比如用户名等)就可以保存在这些变量中。然后在用户失去连接的时候,就可以在close事件的回调函数中通过闭包的方式获取这些信息了。不知道能不能帮到你,也欢迎更多的高手来帮忙。

var clients = {};
wss.on('connection', function(ws){
  clients.push([ws,userId]);
  var cid = client.id;
  clients[cid]=[ws,'另外的一些信息'];
  ws.on('disconnect',function(){
    delete clients[cid][0];
    console.log('Client['+cid+'] has disconnected');
    console.log('User info '+clients[cid][1]);
  });
});

谢谢大家的回答

当你处理 WebSocket 连接关闭时,你可以通过 ws 对象获取与之相关的用户信息。在你的代码中,每个客户端被添加到 clients 数组时,包含了 WebSocket 实例和一个用户 ID(userId)。当连接关闭时,你可以从 clients 数组中找到对应的记录,并获取用户的其他信息(例如用户名等)。

下面是一个改进后的代码示例,展示如何在连接关闭时获取并处理用户信息:

var clients = []; // 使用数组更好
var userId = 0;

wss.on('connection', function(ws) {
    var userInfo = { ws: ws, id: userId, name: 'User' + userId }; // 假设每个用户有一个名字
    clients.push(userInfo);
    ++userId;

    ws.on('message', function(msg) {
        console.log('Received: ' + msg);
    });
});

wss.on('close', function(ws) {
    for (let i = 0; i < clients.length; i++) {
        if (clients[i].ws === ws) {
            let disconnectedUser = clients[i];
            console.log('Disconnected user: ', disconnectedUser.name);
            clients.splice(i, 1); // 移除已断开连接的用户
            break;
        }
    }
});

在这个例子中,每当有新的 WebSocket 连接建立时,我们会将包含 wsidname 的对象添加到 clients 数组中。当检测到连接关闭时,我们遍历 clients 数组来查找匹配的 ws 对象,从而可以访问用户的详细信息(如 name)。

这种方式可以帮助你更好地管理和跟踪 WebSocket 客户端连接的状态。

回到顶部