Javascript Socket io Nodejs-当用户打开多个选项卡时进行管理
我正在尝试在我的应用程序中编写聊天,我遇到了一个不知道如何管理的问题! 这是塞纳里奥: 我们有很多经过身份验证的用户,所以他们都有一个唯一的id,我想实现一个类似Facebook的聊天功能,这样每两个用户都可以互相聊天。 为此,我有一个包含以下内容的server.js文件:Javascript Socket io Nodejs-当用户打开多个选项卡时进行管理,javascript,node.js,laravel-5,redis,socket.io,Javascript,Node.js,Laravel 5,Redis,Socket.io,我正在尝试在我的应用程序中编写聊天,我遇到了一个不知道如何管理的问题! 这是塞纳里奥: 我们有很多经过身份验证的用户,所以他们都有一个唯一的id,我想实现一个类似Facebook的聊天功能,这样每两个用户都可以互相聊天。 为此,我有一个包含以下内容的server.js文件: var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server);
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var users = [];
server.listen(8890);
io.on('connection', function (socket) {
console.log("client connected");
var redisClient = redis.
redisClient.subscribe('message');
redisClient.on("message", function(channel, data) {
var data = JSON.parse(data);
socket.to('user_'+data.user).emit(channel, data);
});
// join a room
socket.on('newUser',function (user, type){
socket.type = type;
socket.join('user_'+user);
});
});
和一个client.js:
var socket = io.connect( 'http://127.0.0.1:8890' );
if (auth) {
socket.on('connect', function(){
socket.emit('newUser', userId, userType);
});
}
socket.on( 'message', function( data ) {
console.log(data);
// var data = JSON.parse(data);
var content = $( "#messages" ).html();
var newMsgContent = '<li>' + data.message + '</li>';
var newContent = newMsgContent + content;
$( "#messages" ).html( newContent );
});
在上面的代码中,只要用户打开我的应用程序,就会使用一个连接,新用户就会启动,所以我用他的Id为这个用户创建了一个房间,并将他加入这个房间(socket.join('user_'+user))。
然后,当用户想要向该用户发送消息时,我只需发送接收方用户的id(我们之前为他创建了一个房间),并将该id所在的房间发送到该房间(socket.to('user_'+data.user.)。emit(channel,data);)。
问题是,当用户打开多个选项卡时,其中每个选项卡都被识别为用户,并将使用另一个socket.id加入到同一房间,但两者都是具有唯一id的用户!
然后,当我向打开两个选项卡的用户发送消息时,他将从一个请求中收到两条消息!比如:
你好id 5
你好id 5
那么现在我该怎么做才能将每个选项卡的消息发送到用户打开的所有选项卡!
提前感谢。移动您的
redisCLient。在连接侦听器之外订阅。每次建立连接时,都会再次附加事件,这就是为什么会得到重复的事件
var redisClient = redis.createClient();
redisClient.subscribe('message');
redisClient.on("message", function(channel, data) {
var data = JSON.parse(data);
//Changed socket.to with io.to
io.to('user_'+ data.user).emit(channel, data);
});
io.on('connection', function (socket) {
console.log("client connected");
// join a room
socket.on('newUser',function (user, type){
socket.type = type;
socket.join('user_'+user);
});
});
作为旁注,您的客户机代码可以使用
socket.on('message',函数(数据){
控制台日志(数据);
//var data=JSON.parse(数据);
$(“#消息”).append(“”+data.message+” );
});
实际上,我甚至不知道这意味着我在node.js和socket.io中是新手@我猜马可·斯卡兰的眼睛@MarcosCasagrandePut在“redisClient.on”(“message”),函数(通道,数据)中输入控制台日志{`看看它是否触发了两次,因为我在没有redis的情况下测试了你的代码,并且工作正常。是的,没有redis它工作正常!但是为什么!!这是redis的问题吗?@MarcosCasagrandeI确信它不会触发两次!事实上,有时候如果我在chrome中打开4个标签,在firefox中打开一个标签,并从firefox发送一条消息,chrome w我将在一个请求中收到4条消息!它不起作用,我在消息redis客户端上放了一个console.log,但没有发生任何日志!@HassanShojaei那么你就错了,因为仅仅从套接字连接外部移动redis消息侦听器不应该破坏代码,因为redis与socketio无关。是的,我有输入错误,带有that服务器甚至没有启动……但仍然无法在io上运行。on('connection')…!我想前两行应该是这样的:var redisClient=redis.createClient();redisClient.subscribe('message');不可能没有启动redis侦听器,我需要检查完整的代码。
$redis = \LRedis::connection();
$data = ['user' => $request->user, 'message' => $request->message];
if($redis->publish('message', json_encode($data)))
return true;
var redisClient = redis.createClient();
redisClient.subscribe('message');
redisClient.on("message", function(channel, data) {
var data = JSON.parse(data);
//Changed socket.to with io.to
io.to('user_'+ data.user).emit(channel, data);
});
io.on('connection', function (socket) {
console.log("client connected");
// join a room
socket.on('newUser',function (user, type){
socket.type = type;
socket.join('user_'+user);
});
});
socket.on( 'message', function( data ) {
console.log(data);
// var data = JSON.parse(data);
$( "#messages" ).append('<li>' + data.message + '</li>');
});