Saltar al contenido

¿Enviando un mensaje a usuarios conectados específicos usando webSocket?

Te traemos el resultado a este dilema, al menos eso creemos. Si presentas alguna interrogante puedes escribirlo en el apartado de comentarios, que con placer te ayudaremos

Solución:

Este no es solo el camino correcto a seguir, sino el único camino. Básicamente, cada conexión necesita una identificación única. De lo contrario no podrás identificarlos, así de simple.

Ahora, cómo lo representará es una cosa diferente. Hacer un objeto con id y connection properties es una buena manera de hacerlo (definitivamente lo haría). También puede adjuntar el id directamente al objeto de conexión.

También recuerde que si desea comunicación entre usuarios, también debe enviar la identificación del usuario objetivo, es decir, cuando el usuario A desea enviar un mensaje al usuario B, obviamente A debe conocer la identificación de B.

Aquí hay un servidor de chat simple de mensajería privada/directa.

package.json


  "name": "chat-server",
  "version": "0.0.1",
  "description": "WebSocket chat server",
  "dependencies": 
    "ws": "0.4.x"
  

server.js

var webSocketServer = new (require('ws')).Server( 5000)),
    webSockets =  // userID: webSocket

// CONNECT /:userID
// wscat -c ws://localhost:5000/1
webSocketServer.on('connection', function (webSocket) 
  var userID = parseInt(webSocket.upgradeReq.url.substr(1), 10)
  webSockets[userID] = webSocket
  console.log('connected: ' + userID + ' in ' + Object.getOwnPropertyNames(webSockets))

  // Forward Message
  //
  // Receive               Example
  // [toUserID, text]      [2, "Hello, World!"]
  //
  // Send                  Example
  // [fromUserID, text]    [1, "Hello, World!"]
  webSocket.on('message', function(message) 
    console.log('received from ' + userID + ': ' + message)
    var messageArray = JSON.parse(message)
    var toUserWebSocket = webSockets[messageArray[0]]
    if (toUserWebSocket) 
      console.log('sent to ' + messageArray[0] + ': ' + JSON.stringify(messageArray))
      messageArray[0] = userID
      toUserWebSocket.send(JSON.stringify(messageArray))
    
  )

  webSocket.on('close', function () 
    delete webSockets[userID]
    console.log('deleted: ' + userID)
  )
)

Instrucciones

Para probarlo, ejecute npm install instalar ws. Luego, para iniciar el servidor de chat, ejecute node server.js (o npm start) en una pestaña Terminal. Luego, en otra pestaña de Terminal, ejecute wscat -c ws://localhost:5000/1donde 1 es el ID de usuario del usuario que se conecta. Luego, en una tercera pestaña de Terminal, ejecute wscat -c ws://localhost:5000/2y luego, para enviar un mensaje del usuario 2 para 1ingresar ["1", "Hello, World!"].

deficiencias

Este servidor de chat es muy simple.

  • Persistencia

    No almacena mensajes en una base de datos, como PostgreSQL. Entonces, el usuario al que estás enviando un mensaje debe estar conectado al servidor para recibirlo. De lo contrario, el mensaje se pierde.

  • Seguridad

    es inseguro

    • Si conozco la URL del servidor y la ID de usuario de Alice, entonces puedo suplantar a Alice, es decir, conectarme al servidor como ella, permitiéndome recibir sus nuevos mensajes entrantes y enviar mensajes de ella a cualquier usuario cuya ID de usuario también conozca. Para hacerlo más seguro, modifique el servidor para que acepte su token de acceso (en lugar de su ID de usuario) al conectarse. Luego, el servidor puede obtener su ID de usuario de su token de acceso y autenticarlo.

    • No estoy seguro de si es compatible con WebSocket Secure (wss://) conexión ya que solo la he probado en localhosty no estoy seguro de cómo conectarme de forma segura desde localhost.

Para las personas que usan ws versión 3 o superior. Si desea utilizar la respuesta proporcionada por @ma11hew28, simplemente cambie este bloque de la siguiente manera.

webSocketServer.on('connection', function (webSocket) {
  var userID = parseInt(webSocket.upgradeReq.url.substr(1), 10)
webSocketServer.on('connection', function (webSocket, req) {
  var userID = parseInt(req.url.substr(1), 10)

ws El paquete ha movido upgradeReq al objeto de solicitud y puede consultar el siguiente enlace para obtener más detalles.

Referencia: https://github.com/websockets/ws/issues/1114

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *