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>
各位好,刚刚自已试了几个属性,目前已经搞定了 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
事件触发时无法获取到remoteAddress
和remotePort
,但可以通过其他方式来识别和管理这些客户端。
解决方案
你可以通过在连接建立时将每个连接的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.remoteAddress
或socket.remotePort
,因为这些信息在某些情况下可能不可用。不过如果你确实需要这些信息,可以尝试在连接时保存它们。
总结
- 使用
Map
或其他数据结构来存储和管理所有活跃的Socket连接。 - 监听
close
事件以检测连接断开,并从存储的数据结构中删除相应的Socket对象。 - 通过这种方式,即使
remoteAddress
和remotePort
不可用,也可以有效地管理和清理不再活跃的连接。