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/1
donde 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/2
y luego, para enviar un mensaje del usuario 2
para 1
ingresar ["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 enlocalhost
y no estoy seguro de cómo conectarme de forma segura desdelocalhost
.
-
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