我是Nodejs和Socket.io的新手,这是我第一次创建任何聊天应用程序时,如果我问一些愚蠢的问题,请原谅我。
在我的网络中,我需要一些聊天服务,一个是Live辩论,这是一种聊天室,另一个是私人消息,如Facebook Messenger。
我在显示消息之前在私人信使中创建了两个我正在检查对话ID,它的工作非常合适。现场辩论也在适当地进行。
但是有一个问题,在私人信使中发送的任何消息也会在现场辩论窗口中显示。所以我更改了messenger的Server.js文件,并且还更改了监听端口,现在用于现场辩论的监听端口是3000,而对于messenger是8050,但仍然在现场辩论接收信使消息。
我是以错误的方式做这件事的吗?有没有其他方法可以运行两个聊天应用程序?
我正在使用此服务器代码
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();
});
});
使用命名空间 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();
});
});
客户端代码
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);
});
答案 0 :(得分:1)
socket.io支持使用不同的命名空间。您应该使用该功能而不是创建两个单独的服务器。之后,您可以将socket.emit用于该特定命名空间。有关更多信息,请参阅文档:https://socket.io/docs/rooms-and-namespaces/
答案 1 :(得分:0)
这不是太难,我写了一个聊天应用程序,因为我认为每个人在启动nodejs时都会这样做,但是nodeJS的房间很容易使用。
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});
});
})
这几乎是你所需要的。这适用于PM,因为你只是不允许多个用户加入这个聊天室,以及多个用户可以加入的普通聊天室。