Socket.ioを使用してチャットアプリを作成していますが、デフォルトのクライアントID(8411473621394412707
、1120516437992682114
)。接続時にカスタム識別子を送信する方法や、各IDのカスタム名を追跡するために何かを使用する方法はありますか?ありがとう!
サーバー上に配列を作成し、カスタムオブジェクトを格納できます。たとえば、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>
お役に立てれば。
カスタムソケットIDを設定するには、 generateId 関数を上書きする必要があります。 Socket.io
serverオブジェクトの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.id
がgenerateId
として返される場合、 async/await
の組み合わせは、node.js
バージョン7.6.0以降でこの問題を克服するために使用できます。handshake
node_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);
};
最新の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
});
ハッシュルックアップとしてオブジェクトを使用します-これにより、配列をループする必要がなくなります
var clients = {};
clients[customId] = clientId;
var lookup = clients[customId];
または、次のようにソケットIDをオーバーライドできます。
io.on('connection', function(socket){
socket.id = "YOUR_CUSTOM_ID";
});
あなたは配列の下に見ることができます:
io.sockets.sockets
ソケットIDを自分で選択したIDに変更しないでください。Socket.ioルームシステムが完全に破壊されます。静かに失敗し、クライアントがメッセージを受信しない理由がわかりません。
_"socket.io": "^2.2.0"
_を使用
io.use((socket, next) => { io.engine.generateId = () => socket.handshake.query.token; next(null, true); });
特定のクライアントと通信するためにカスタム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")
});
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);
});
`