Node.js Socket.io和Redis向除发送方以外的所有客户端广播
我在后端使用Laravel制作聊天应用程序。但是当我使用Node.js Socket.io和Redis向除发送方以外的所有客户端广播,node.js,laravel,redis,socket.io,broadcast,Node.js,Laravel,Redis,Socket.io,Broadcast,我在后端使用Laravel制作聊天应用程序。但是当我使用redis时,我不能使用broadcast.send功能。现在,如何将消息发送到除发件人之外的所有客户端?此代码有错误: io.broadcast.send(通道+':'+message.event,message.data) 这都是我的服务器代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket
redis
时,我不能使用broadcast.send
功能。现在,如何将消息发送到除发件人之外的所有客户端?此代码有错误:
io.broadcast.send(通道+':'+message.event,message.data)
这都是我的服务器代码:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('chat');
redis.on('message', function(channel, message) {
console.log('Message Recieved: ' + message);
message = JSON.parse(message);
// send all client except sender
io.broadcast.send(channel + ':' + message.event, message.data);
});
io.sockets.on('connection', function(socket) {
console.log('User Connect with ID: ' + socket.id);
});
// run server
http.listen(3001, function(){
console.log('Listening on Port 3001');
});
和客户端代码:
var socketClient = io(':3001');
socketClient.on("chat:App\\Events\\ChatEvent", function(message){
// increase the power everytime we load test route
console.log(message);
});
ChatEvent.php
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class ChatEvent extends Event implements ShouldBroadcast
{
use SerializesModels;
public $message;
public function __construct($value)
{
$this->message = $value;
}
public function broadcastOn()
{
return ['chat'];
}
}
尝试使用通配符
class messageEvent extends Event implements ShouldBroadcast
{
use SerializesModels;
public $userid;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user)
{
if($user==\Auth::guard('admin')->user()->id){
return false;
}
$this->userid = $user;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['ChatEvent-'.$this->userid];
}
}
在Js中进行更改
var socketClient = io(':3001');
socketClient.on("chat:App\\Events\\ChatEvent-<?php echo \Auth::guard('admin')->user()->id; ?>", function(message){
console.log(message);
});
var socketClient=io(':3001');
socketClient.on(“chat:App\\Events\\ChatEvent-”,函数(消息){
控制台日志(消息);
});
尝试使用通配符
class messageEvent extends Event implements ShouldBroadcast
{
use SerializesModels;
public $userid;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user)
{
if($user==\Auth::guard('admin')->user()->id){
return false;
}
$this->userid = $user;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['ChatEvent-'.$this->userid];
}
}
在Js中进行更改
var socketClient = io(':3001');
socketClient.on("chat:App\\Events\\ChatEvent-<?php echo \Auth::guard('admin')->user()->id; ?>", function(message){
console.log(message);
});
var socketClient=io(':3001');
socketClient.on(“chat:App\\Events\\ChatEvent-”,函数(消息){
控制台日志(消息);
});
您可以使用附加参数扩展emit()函数,例如send_to_self=True,该参数与broadcast=True或room值一起配置是否应包括当前客户端。默认情况下,情况将保持不变,但如果将send_to_self设置为False,则迭代所有客户端以通知的循环将跳过当前连接。要检测哪一个是当前的,可以使用request.namespace,它是活动客户端的命名空间对象
所以你的代码是
io.emit(channel + ':' + message.event, message.data,send_to_self=false);
您可以使用附加参数扩展emit()函数,例如send_to_self=True,该参数与broadcast=True或房间值一起配置是否应包括当前客户端。默认情况下,情况将保持不变,但如果将send_to_self设置为False,则迭代所有客户端以通知的循环将跳过当前连接。要检测哪一个是当前的,可以使用request.namespace,它是活动客户端的命名空间对象
所以你的代码是
io.emit(channel + ':' + message.event, message.data,send_to_self=false);
您可以使用助手广播来完成此操作,然后使用方法toOthers()
有关更多详细信息,请访问docs您可以使用helper广播来执行此操作,然后使用方法toOthers()
更多详情请访问docs谢谢@ronak,但我想你不明白我的意思。我想用socket.io服务器配置将消息广播给除发送者以外的所有客户端。@Ehsan“如果($user==\Auth::guard('admin')->user()->id)”在这种情况下,发送者将触发事件,发送者将被忽略。谢谢@ronak,但我想你不明白我的意思。我想将消息广播到除具有socket.io服务器配置的发件人之外的所有客户端。@Ehsan“如果($user==\Auth::guard('admin')->user()->id)”在这种情况下,事件将与发件人一起激发,发件人将被忽略。。