Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 获取node.js套接字关闭/结束事件的远程端点属性_Sockets_Node.js - Fatal编程技术网

Sockets 获取node.js套接字关闭/结束事件的远程端点属性

Sockets 获取node.js套接字关闭/结束事件的远程端点属性,sockets,node.js,Sockets,Node.js,我有一个node.js服务器,它使用套接字的关联数组跟踪连接到它的所有“客户机”,因为我有时需要向特定客户机发送一些数据。该数组中的键是由 socket.remoteAddress + ':' + socket.remotePort 和值是传递给提供给net.createServer(…)的回调的套接字实例 有时客户端由于某种原因断开连接,我收到“结束”和“关闭”事件。我想从客户端注册表中删除断开连接的客户端,但在close/end事件回调中,remoteAddress和remotePort变

我有一个node.js服务器,它使用套接字的关联数组跟踪连接到它的所有“客户机”,因为我有时需要向特定客户机发送一些数据。该数组中的键是由

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之上使用自定义协议。