2017-10-04 1 views
0

J'essaie d'envoyer un message privé entre les utilisateurs dans un simple chat que j'ai créé en utilisant HTML5 websocket et node.js.Comment utiliser l'ID client dans HTML5 websocket et node.js chat?

Lorsque les utilisateurs se connectent, je crée simple ID pour eux (ID de connexion) et d'ajouter que ce CLIENTS=[];

Quand je fais une console.log(CLIENTS);, je vois tous les ID comme ceci:

[0, 1, 2] 

Maintenant, je dois utiliser les ID pour envoyer des messages privés aux utilisateurs.

donc je suis allé de l'avant et ce (Pour les fins de test, j'ai juste besoin d'envoyer le message à l'utilisateur avec ID 2):

var express = require('express'), 
     app = express(), 
     http = require('http').Server(app), 
     WebSocketServer = require('ws').Server, 
     wss = new WebSocketServer({ 
      port: 8080 
     }); 

    CLIENTS = []; 
    connectionIDCounter = 0; 


    app.use(express.static('public')); 

    app.get('/', function(req, res) { 
     res.sendFile(__dirname + '/index.html'); 
    }); 

    wss.broadcast = function broadcast(data) { 
     wss.clients.forEach(function each(client) { 
      client.send(data); 
     }); 
    }; 

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

    /////////SEE THE IDs HERE//////////////// 

    ws.id = connectionIDCounter++; 
    CLIENTS.push(ws.id); 
    console.log(CLIENTS); 


     ws.on('message', function(msg) { 
      data = JSON.parse(msg); 


    /////SEND A PRIVATE MESSAGE TO USER WITH THE ID 2////// 

    CLIENTS['2'].send(data.message); 

    }); 

}); 

http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

Quand je lance mon code, je reçois le texte suivant erreur:

TypeError: CLIENTS.2.send is not a function 

Pourriez-quelqu'un s'il vous plaît des conseils sur ce problème?

Toute aide serait appréciée.

Merci d'avance.

+0

'CLIENTS = []' => 'CLIENTS = {}', 'CLIENTS.push (ws.id);' => 'CLIENTS [ws.id] = ws'. Fondamentalement, vous avez enregistré l'identifiant du client, au lieu de la connexion client. –

+0

qu'est-ce que cela signifie: CLIENTS = [] => CLIENTS = {}, CLIENTS.push (ws.id); => CLIENTS [ws.id] = ws? –

+0

Remplacer le tableau, avec objet. Enregistrer la connexion ws entière, au lieu de l'ID uniquement. –

Répondre

1
  1. clients Track manuellement, remplacer: CLIENTS = [] avec CLIENTS = {} et CLIENTS.push(ws.id); avec CLIENTS[ws.id] = ws;

  2. Selon quais https://github.com/websockets/ws/blob/master/doc/ws.md devrait être quelque chose comme ceci:

new WebSocket.Server(options[, callback])
clientTracking {Boolean} Specifies whether or not to track clients.

server.clients - A set that stores all connected clients. Please note that this property is only added when the clientTracking is truthy.

var WebSocketServer = require('ws').Server, 
     wss = new WebSocketServer({ 
       port: 8080, 
       clientTracking: true 
     }); 

    ..... 

    wss.on('connection', function(ws) { 
     ws.on('message', function(msg) { 
      data = JSON.parse(msg); 
      wss.clients[ID].send(data.message); 
     }); 
    }); 

Je ne connais pas le format de données wss.clients, vous devriez donc l'essayer vous-même. Si c'est vraiment {Set} comme docks dit, alors essayez wss.clients.get(ID).send(data.message)

+0

n'est pas 'wss.clients [ID] .send (data.message);' devrait être 'wss.CLIENTS [ID] .send (data.message);'? –

+0

non, essayez le code de l'exemple –