Soy nuevo en Nodejs y Socket.io, y esta es la primera vez que estoy creando una aplicación de chat, así que disculpe si estoy haciendo una pregunta tonta.
En mi web tengo una especie de servicios de chat, uno es el debate en vivo que es una especie de sala de chat, y otro es la mensajería privada como Facebook Messenger.
He creado ambos, en mensajería privada antes de mostrar el mensaje, estoy revisando la identificación de la conversación, está funcionando bastante bien. El debate en vivo también está funcionando adecuadamente.
Pero hay un problema, cualquier mensaje enviado en mensajería privada también se muestra en la ventana de debate en vivo. Así que cambié el archivo Server.js para messenger y también cambié el puerto de escucha, ahora el puerto de escucha para el debate en vivo es 3000 y para messenger es 8050, pero el debate en vivo sigue recibiendo los mensajes de messenger.
¿Estoy haciendo esto de manera incorrecta? ¿Hay alguna otra forma de ejecutar dos aplicaciones de chat?
Estoy usando este código de servidor
var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); var redis = require('redis'); server.listen(3000); io.on('connection', function (socket) { console.log("client connected"); var redisClient = redis.createClient(); redisClient.subscribe('message'); redisClient.on("message", function(channel, data) { console.log("mew message add in queue "+ data+ " channel"); socket.emit(channel, data); }); socket.on('disconnect', function() { redisClient.quit(); }); });
Con el uso de Namespace server.js
var nsp = io.of('/debate') nsp.on('connection', function (socket) { console.log("client connected"+socket.id); var redisClient = redis.createClient(); redisClient.subscribe('message'); var redisClient1 = redis.createClient(); redisClient1.subscribe('debate'); redisClient.on("message", function(channel, data) { console.log("mew message add in queue "+ data+ " channel"); nsp.emit(channel, data); }); socket.on('disconnect', function() { redisClient.quit(); }); });
codigo del cliente
var socket = io.connect('http://localhost:3000/debate'); socket.on('message', function (data) { data = jQuery.parseJSON(data); console.log(data.user); $( "#messages" ).append( "<strong>"+data.user+":</strong><p>"+data.message+"</p>" ); $('#messages').animate({ scrollTop: $('#messages').get(0).scrollHeight}, 200); });
socket.io admite el uso de diferentes espacios de nombres. Debería usar esa función en lugar de crear dos servidores individuales. Después de eso, puede usar socket.emit para ese espacio de nombres específico. Para obtener más información, consulte la documentación: https://socket.io/docs/rooms-and-namespaces/
No es demasiado difícil, escribí una aplicación de chat, como creo que todos hacen cuando inician nodejs, pero nodeJS tiene salas que son bastante fáciles de usar.
io.on('connection', function(client){ client.on('room_connection', function(id){ client.join(id); // User joins room. }) client.on('message', function(data){ io.to(data.room).emit('message', {message:data.message, client:client.conn.id}); }); })
Esto es prácticamente todo lo que necesitas. Esto funciona para los PM, ya que simplemente no permitirá que varios usuarios se unan a esta sala de chat y a las salas de chat normales a las que pueden unirse varios usuarios.