web-dev-qa-db-ja.com

Socket.ioカスタムクライアントID

Socket.ioを使用してチャットアプリを作成していますが、デフォルトのクライアントID(84114736213944127071120516437992682114)。接続時にカスタム識別子を送信する方法や、各IDのカスタム名を追跡するために何かを使用する方法はありますか?ありがとう!

27
pmerino

サーバー上に配列を作成し、カスタムオブジェクトを格納できます。たとえば、Socket.ioによって作成されたIDと、各クライアントからサーバーに送信されたカスタムIDを保存できます。

var util = require("util"),
    io = require('/socket.io').listen(8080),
    fs = require('fs'),
    os = require('os'),
    url = require('url');

    var clients =[];

    io.sockets.on('connection', function (socket) {

        socket.on('storeClientInfo', function (data) {

            var clientInfo = new Object();
            clientInfo.customId         = data.customId;
            clientInfo.clientId     = socket.id;
            clients.Push(clientInfo);
        });

        socket.on('disconnect', function (data) {

            for( var i=0, len=clients.length; i<len; ++i ){
                var c = clients[i];

                if(c.clientId == socket.id){
                    clients.splice(i,1);
                    break;
                }
            }

        });
    });

この例では、各クライアントからstoreClientInfoを呼び出す必要があります。

<script>
    var socket = io.connect('http://localhost', {port: 8080});

    socket.on('connect', function (data) {
        socket.emit('storeClientInfo', { customId:"000CustomIdHere0000" });
    });
</script>

お役に立てれば。

41
oscarm

カスタムソケットIDを設定するには、 generateId 関数を上書きする必要があります。 Socket.ioserverオブジェクトのeioおよびengine両方のプロップを使用して、この操作を管理できます。 。

簡単な例:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.engine.generateId = function (req) {
    // generate a new custom id here
    return 1
}

io.on('connection', function (socket) {
    console.log(socket.id); // writes 1 on the console
})

処理されたようです。

ソケットIDはunpredictableであり、セキュリティとアプリの操作を考慮した一意の値でなければならないことに注意してください!

Extra:undefinedメソッドの集中的なプロセスのためにsocket.idgenerateIdとして返される場合、 async/awaitの組み合わせは、node.jsバージョン7.6.0以降でこの問題を克服するために使用できます。
handshakenode_modules/engine.io/lib/server.jsファイルのメソッドは、次のように変更する必要があります。

current:

// engine.io/lib/server.js

Server.prototype.generateId = function (req) {
  return base64id.generateId();
};

Server.prototype.handshake = function (transportName, req) {
  var id = this.generateId(req);
  ...
}

new:

// function assignment

io.engine.generateId = function (req) {
  return new Promise(function (resolve, reject) {
    let id;
    // some intense id generation processes
    // ...
    resolve(id);
  });
};


// engine.io/lib/server.js

Server.prototype.handshake = async function (transportName, req) {
  var id = await this.generateId(req);
  ...
}

注:Engine.io v4. では、generateIdメソッドはコールバックを受け入れます。したがって、handshakeメソッドを変更する必要はありません。 generateIdメソッドの置換だけで十分です。例えば:

io.engine.generateId = function (req, callback) {
  // some intense id generation processes
  // ...
  callback(id);
};
10
efkan

最新のsocket.io(バージョン1.x)では、次のようなことができます

socket  = io.connect('http://localhost');

socket.on('connect', function() {
    console.log(socket.io.engine.id);     // old ID
    socket.io.engine.id = 'new ID';
    console.log(socket.io.engine.id);     // new ID
});
6
Salvador Dali

ハッシュルックアップとしてオブジェクトを使用します-これにより、配列をループする必要がなくなります

var clients = {};
clients[customId] = clientId;

var lookup = clients[customId];
5
James Westgate

または、次のようにソケットIDをオーバーライドできます。

io.on('connection', function(socket){

      socket.id = "YOUR_CUSTOM_ID";
});

あなたは配列の下に見ることができます:

io.sockets.sockets

3
Aviram Net

ソケットIDを自分で選択したIDに変更しないでください。Socket.ioルームシステムが完全に破壊されます。静かに失敗し、クライアントがメッセージを受信しない理由がわかりません。

3
user5536767

_"socket.io": "^2.2.0"_を使用

io.use((socket, next) => { io.engine.generateId = () => socket.handshake.query.token; next(null, true); });

0

特定のクライアントと通信するためにカスタムIDを使用しようとしている場合、これを行うことができます

io.on('connection', function(socket){
    socket.id = "someId"
    io.sockets.connected["someId"] = io.sockets.connected[socket.id];

    // them emit to it by id like this
    io.sockets.connected["someId"].emit("some message", "message content")
});
0
Ahmadposten

Forループの代わりにオブジェクト形式でcustomId(サンプルのuserId)を保存できます。これにより、接続中のパフォーマンスが向上し、発行のためのsocketIdの切断と取得が行われます。

`

 var userId_SocketId_KeyPair = {};
 var socketId_UserId_KeyPair = {};

_io.on('connection', (socket) => {
    console.log('Client connected');
    //On socket disconnect
    socket.on('disconnect', () => {
        // Removing sockets
        let socketId = socket.id;
        let userId = socketId_UserId_KeyPair[socketId];
        delete socketId_UserId_KeyPair[socketId];
        if (userId != undefined) {
            delete userId_SocketId_KeyPair[userId];
        }
        console.log("onDisconnect deleted socket with userId :" + "\nUserId,socketId :" + userId + "," + socketId);
    });

    //Store client info
    socket.on('storeClientInfo', function (data) {
        let jsonObject = JSON.parse(data);
        let userId = jsonObject.userId;
        let socketId = socket.id;
        userId_SocketId_KeyPair[userId] = socketId;
        socketId_UserId_KeyPair[socketId] = userId;
        console.log("storeClientInfo called with :" + data + "\nUserId,socketId :" + userId + "," + socketId);
    });
`
0
partikles