2

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

socket.remoteAddress + ':' + socket.remotePort

和值是传递给提供给 net.createServer(...) 的回调的套接字实例 有时客户端出于某种原因断开连接,我收到“结束”和“关闭”事件。我想从我的客户端注册表中删除断开连接的客户端,但在关闭/结束事件回调中,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;
    });
});
4

1 回答 1

1

我认为您应该使用 socket.id 而不是创建自己的可能不唯一的对象属性

socket.on('connect', function(){
        registry [socket.id] = socket;
});

更新

Node 提供基本的 http API。Http 是无状态的。HTTP 会话允许将信息与单个访问者相关联,但节点没有本地会话支持。

看看express,它是一个不错的带有会话支持的 web 框架

此外,如果您需要实时发送消息,请查看socket.io

更新 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")
    });
});
于 2012-04-10T15:03:25.313 回答