99

node.js でソケットを使用しようとしていますが、成功しましたが、コード内でクライアントを区別する方法がわかりません。ソケットに関する部分は次のとおりです。

var WebSocketServer = require('ws').Server, 
    wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws) {
    ws.on('message', function(message) {
        console.log('received: %s', message); 
        ws.send(message);
    });
    ws.send('something');
});

このコードは、クライアント js で正常に動作します。

しかし、サーバー上でソケットを開いている特定のユーザーまたはすべてのユーザーにメッセージを送信したいと考えています。

私の場合、クライアントとしてメッセージを送信し、応答を受け取りましたが、他のユーザーには何も表示されません。

たとえば、user1 が webSocket 経由でサーバーにメッセージを送信し、ソケットを開いている user2 に通知を送信したいとします。

4

12 に答える 12

119

nodejs では、ws クライアントを直接変更し、各クライアントのカスタム属性を個別に追加できます。また、グローバル変数wss.clientsがあり、どこでも使用できます。次のコードを試して、少なくとも 2 つのクライアントに接続してみてください。

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
    server: httpsServer
});


wss.getUniqueID = function () {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
    }
    return s4() + s4() + '-' + s4();
};

wss.on('connection', function connection(ws, req) {
    ws.id = wss.getUniqueID();

    wss.clients.forEach(function each(client) {
        console.log('Client.ID: ' + client.id);
    });
});

クライアント接続 URL でパラメーターを直接渡すこともできます。

https://myhost:8080?myCustomParam=1111&myCustomID=2222

接続関数では、これらのパラメーターを取得して、これらのパラメーターを ws クライアントに直接割り当てることができます。

wss.on('connection', function connection(ws, req) {

    const parameters = url.parse(req.url, true);

    ws.uid = wss.getUniqueID();
    ws.chatRoom = {uid: parameters.query.myCustomID};
    ws.hereMyCustomParameter = parameters.query.myCustomParam;
}
于 2017-10-22T19:35:19.253 に答える
68

ユーザー ID を配列 CLIENTS[] に割り当てるだけで、これにはすべてのユーザーが含まれます。以下に示すように、すべてのユーザーにメッセージを直接送信できます。

var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({port: 8080}),
    CLIENTS=[];

wss.on('connection', function(ws) {
    CLIENTS.push(ws);
    ws.on('message', function(message) {
        console.log('received: %s', message);
        sendAll(message);
    });
    ws.send("NEW USER JOINED");
});

function sendAll (message) {
    for (var i=0; i<CLIENTS.length; i++) {
        CLIENTS[i].send("Message: " + message);
    }
}
于 2013-06-20T20:56:14.810 に答える
13

リクエストヘッダー「sec-websocket-key」を使用できます

wss.on('connection', (ws, req) => {
  ws.id = req.headers['sec-websocket-key']; 

  //statements...
});
于 2018-05-18T08:56:57.427 に答える
11

Worlize サーバーのこのコード スニペットは、私を大いに助けてくれました。ws を使用している場合でも、コードは簡単に適応できるはずです。ここで重要な部分を選択しました。

// initialization
var connections = {};
var connectionIDCounter = 0;

// when handling a new connection
connection.id = connectionIDCounter ++;
connections[connection.id] = connection;
// in your case you would rewrite these 2 lines as
ws.id = connectionIDCounter ++;
connections[ws.id] = ws;

// when a connection is closed
delete connections[connection.id];
// in your case you would rewrite this line as
delete connections[ws.id];

これで、リンクされたコードに示されているように、broadcast() および sendToConnectionId() 関数を簡単に作成できるようになりました。

それが役立つことを願っています。

于 2013-03-06T19:27:39.227 に答える
8

使用している websocket によって異なります。たとえば、ここにある最速のもの: https://github.com/websockets/wsは、次の方法でブロードキャストを実行できます。

var WebSocketServer = require('ws').Server,
   wss = new WebSocketServer({host:'xxxx',port:xxxx}),
   users = [];
wss.broadcast = function broadcast(data) {
wss.clients.forEach(function each(client) {
  client.send(data);
 });
};

その後、コードの後半で wss.broadcast(message) を使用してすべてに送信できます。個々のユーザーに PM を送信するには、次のようにします。

(1)サーバーに送信するメッセージにユーザー名を含めます(2)次に、onMessageで、そのユーザー名で配列にwebsocketを保存し、後でユーザー名で取得します:

wss.on('connection', function(ws) {

  ws.on('message', function(message) {

      users[message.userName] = ws;

(3) 特定のユーザーに送信するには、users[userName].send(message); を実行します。

于 2015-10-14T19:16:53.513 に答える
4

ws オブジェクトから fd を使用しています。クライアントごとに一意である必要があります。

var clientID = ws._socket._handle.fd;

新しいブラウザ タブを開くと、別の番号が表示されます。

最初の ws は 11 で、次は 12 でした。

于 2015-07-25T19:05:56.947 に答える
2

ここで考えられる解決策の 1 つは、ユーザー ID の前に deviceId を追加することです。これにより、ユーザー ID は同じでもデバイスが異なる複数のユーザーを分離できます。

ws://xxxxxxx:9000/userID/<<deviceId>>

于 2017-11-14T12:06:26.300 に答える
0

グローバル カウンター変数を使用し、新しい接続ごとにその値を割り当てます。

const wss = new WebSocket.Server({server});
let count_clients = 0;
wss.on('connection', function connection(ws){
    ws.id=count_clients++;
    console.log(`new connection, ws.id=${ws.id}, ${ws._socket.remoteAddress}:${ws._socket.remotePort} #clients=${wss.clients.size}`);
    ws.on('close', req => {console.log(`disconnected, ws.id=${ws.id}, ${ws._socket.remoteAddress}:${ws._socket.remotePort} #clients=${wss.clients.size}`);});
...
于 2021-08-11T12:02:13.700 に答える