2

特定のクライアントにデータを送信する必要がある場合があるため、ソケットの連想配列を使用して、接続されているすべての「クライアント」を追跡する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;
    });
});
4

1 に答える 1

1

一意ではない可能性のある独自のオブジェクトプロパティを作成する代わりに、socket.idを使用する必要があると思います

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

アップデート

ノードは基本的なhttpAPIを提供します。Httpはステートレスです。HTTPセッションでは、個々の訪問者に情報を関連付けることができますが、ノードはネイティブセッションをサポートしていません。

エクスプレスを見てください、それはセッションをサポートする素晴らしいウェブフレームワークです

また、リアルタイムでメッセージを送信する必要がある場合は、socket.ioをご覧ください。

UPDATE 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 に答える