Sockets 获取node.js套接字关闭/结束事件的远程端点属性
我有一个node.js服务器,它使用套接字的关联数组跟踪连接到它的所有“客户机”,因为我有时需要向特定客户机发送一些数据。该数组中的键是由Sockets 获取node.js套接字关闭/结束事件的远程端点属性,sockets,node.js,Sockets,Node.js,我有一个node.js服务器,它使用套接字的关联数组跟踪连接到它的所有“客户机”,因为我有时需要向特定客户机发送一些数据。该数组中的键是由 socket.remoteAddress + ':' + socket.remotePort 和值是传递给提供给net.createServer(…)的回调的套接字实例 有时客户端由于某种原因断开连接,我收到“结束”和“关闭”事件。我想从客户端注册表中删除断开连接的客户端,但在close/end事件回调中,remoteAddress和remotePort变
socket.remoteAddress + ':' + socket.remotePort
和值是传递给提供给net.createServer(…)的回调的套接字实例
有时客户端由于某种原因断开连接,我收到“结束”和“关闭”事件。我想从客户端注册表中删除断开连接的客户端,但在close/end事件回调中,remoteAddress和remotePort变量未定义。它们能被找回吗
举例说明:
var registry = {}
var server = net.createServer(function (socket) {
socket.on('connect', function(){
registry [socket.remoteAddress + ':' + socket.remotePort] = socket;
});
socket.on('close', function(had_error){
// ******************************************************
// socket.remoteAddress and remotePort are undefined here
// ******************************************************
var id = socket.remoteAddress + ':' + socket.remotePort;
// *************************************************************
if(registry.hasOwnProperty(id)
delete socket.id;
});
});
我认为您应该使用socket.id,而不是创建自己的对象属性,该属性可能不是唯一的
socket.on('connect', function(){
registry [socket.id] = socket;
});
更新
节点提供基本的http API。Http是无状态的。HTTP会话允许将信息与单个访问者关联,但节点不支持本机会话
看看,这是一个很好的web框架,支持会话
此外,如果您需要以实时方式发送消息,请查看
更新V2
您可以将自己的ID属性添加到套接字对象:
function randomID(len){
//Generate a random String
return randID;
}
var registry = {}
var server = net.createServer(function (socket) {
socket.on('connect', function(){
var uid = randomID(32);
socket.id = uid;
registry [uid] = socket;
});
socket.on('close', function(had_error){
var uid = socket.id;
// *************************************************************
console.log("Socket ID " + uid + " disconnected")
});
});
根据本文,默认情况下没有socket.id这样的东西。我错过什么了吗?对不起,我的错。因为你说的是发送消息,所以我认为“socket”来自
socket.io
实例。由于http连接通常较短且无状态,因此您需要的是会话。我将尝试更新我的答案我不是在处理HTTP,而是在TCP之上使用自定义协议。