Nodejs socket的问题,请各位赐教

Nodejs socket的问题,请各位赐教

我想用nodejs做一个在线管理列表,但是当socket断开时,我怎么从这个列表中清除呢?根据什么清除呢? 我监听close方法时,socket.remotePort和socket.remoteAddress都是获取不到的,怎么办呢? 请各位大虾帮帮忙,在线等!急!谢谢!

socket.on(‘close’, function (err) { if (err) {

            log.warn("【错误】socket出现一次异常关闭,此链接已断开" + err + "[IP]");
        } else {
            console.log("【错误】socket正常关闭" + err);
        }
        log.info('当前关闭的客户端IP: ' + String(socket.remoteAddress));
});</code></pre>

4 回复

针对你提到的问题,我们可以使用Node.js的net模块或者socket.io来创建一个简单的服务器,并处理客户端连接和断开的逻辑。下面我将分别介绍如何使用这两种方式来解决你的问题。

使用net模块

首先,让我们看看如何使用Node.js内置的net模块来实现基本的TCP服务器,并处理客户端断开连接的情况:

const net = require('net');

// 创建一个服务器
const server = net.createServer((socket) => {
    console.log('客户端已连接');

    // 当客户端断开连接时触发
    socket.on('end', () => {
        console.log(`客户端已断开连接`);
        // 在这里你可以从管理列表中删除对应的客户端信息
    });

    // 监听错误事件
    socket.on('error', (err) => {
        console.error(`Socket error: ${err.message}`);
        // 处理错误并可能需要清理资源
    });
});

server.listen(3000, () => {
    console.log('服务器正在监听端口 3000');
});

在这个例子中,我们使用了socket.on('end')来监听客户端断开连接的事件。一旦发生这种情况,我们就可以执行相应的清理操作,比如从在线管理列表中移除该客户端的信息。

使用socket.io

如果你希望使用更高级的功能,比如自动重连、房间等功能,可以考虑使用socket.io库。下面是使用socket.io的一个简单示例:

const io = require('socket.io')(3000);

io.on('connection', (socket) => {
    console.log('新客户端连接');

    // 当客户端断开连接时触发
    socket.on('disconnect', () => {
        console.log('客户端已断开连接');
        // 在这里你可以从管理列表中删除对应的客户端信息
    });

    // 错误处理
    socket.on('error', (err) => {
        console.error(`Socket error: ${err.message}`);
    });
});

在这个例子中,我们使用了socket.on('disconnect')来监听客户端断开连接的事件。同样地,当检测到客户端断开连接时,我们可以在管理列表中移除相应的条目。

以上两种方法都可以帮助你有效地处理客户端断开连接的情况,并确保你的在线管理列表保持准确。


各位好,刚刚自已试了几个属性,目前已经搞定了 socket连接时,可以用socketId做为唯一标识,进行保存。 socket断时,可用获取socketId来删除对应的数据,更新当前在线好友列表。

socket.on(‘close’, function (err) { if (err) {

            log.warn("【错误】socket出现一次异常关闭,此链接已断开" + err + "[IP]");
        } else {
            console.log("【错误】socket正常关闭" + err);
        }
        log.info('当前关闭的客户端IP: ' + String(socketId));
        deleteOnLineInfo(socketId);
    });

在Node.js中处理Socket断开连接后从在线管理列表中移除相应客户端的一个常见方法是使用close事件。虽然你提到在close事件触发时无法获取到remoteAddressremotePort,但可以通过其他方式来识别和管理这些客户端。

解决方案

你可以通过在连接建立时将每个连接的Socket对象存储在一个全局列表(如数组或Map)中,并且在close事件触发时检查这个列表,找到并删除对应的Socket对象。

示例代码

首先创建一个简单的服务器来接收客户端连接,并管理这些连接:

const net = require('net');
const clients = new Map();

// 创建一个TCP服务器
const server = net.createServer((socket) => {
    // 添加新连接时将其添加到clients集合中
    const id = Date.now();
    clients.set(id, socket);

    console.log(`Client connected with ID ${id}`);

    // 监听socket的close事件
    socket.on('close', () => {
        console.log(`Client with ID ${id} disconnected`);
        clients.delete(id); // 移除断开连接的客户端
    });

    // 监听错误事件,打印错误信息
    socket.on('error', (err) => {
        console.error(`Error in client ${id}: ${err.message}`);
        clients.delete(id);
    });
});

server.listen(3000, () => {
    console.log('Server listening on port 3000');
});

在这个例子中,我们使用了一个Map来存储所有活跃的Socket连接,键为唯一ID,值为Socket对象。每当一个Socket连接关闭时,我们会从Map中删除相应的项,从而实现自动清理功能。

注意,这里没有直接依赖socket.remoteAddresssocket.remotePort,因为这些信息在某些情况下可能不可用。不过如果你确实需要这些信息,可以尝试在连接时保存它们。

总结

  • 使用Map或其他数据结构来存储和管理所有活跃的Socket连接。
  • 监听close事件以检测连接断开,并从存储的数据结构中删除相应的Socket对象。
  • 通过这种方式,即使remoteAddressremotePort不可用,也可以有效地管理和清理不再活跃的连接。
回到顶部