问题描述
我知道广播是为了让其他人实时获取消息。但出于某种原因,我需要它只能由发件人接收。如何实现这一目标?现在,广播已被发送方的所有摘录接收。
我正在使用 redis+ socket.io + laravel event + laravel queue
我确实尝试了一些操作,例如在来自服务器端的广播消息中传递登录用户 ID,然后从客户端检查登录 ID 是否与来自服务器的登录 ID 匹配。然后只显示消息。但看起来,某处配置了发件人不会收到消息。它仅由连接到套接字的其他用户订阅。
那么我如何从服务器端控制它?如何让发件人订阅此特定频道?
仪表板事件文件:
<?PHP
namespace App\Events;
use Illuminate\broadcasting\Channel;
use Illuminate\broadcasting\InteractsWithSockets;
use Illuminate\broadcasting\PresenceChannel;
use Illuminate\broadcasting\PrivateChannel;
use Illuminate\Contracts\broadcasting\ShouldbroadcastNow;
use Illuminate\Foundation\Events\dispatchable;
use Illuminate\Queue\SerializesModels;
class DashboardEvent implements ShouldbroadcastNow
{
use dispatchable,InteractsWithSockets,SerializesModels;
public $actionId;
public $actionData;
public $user;
/**
* Create a new event instance.
*
* @author Author
*
* @return void
*/
public function __construct($actionId,$actionData,$user)
{
$this->actionId = $actionId;
$this->actionData = $actionData;
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* @author Author
*
* @return Channel|array
*/
public function broadcastOn()
{
// return new Channel('action-channel-one');
return [new Channel('action-channel-one')];
}
/**
* Get the data to broadcast.
*
* @author Author
*
* @return array
*/
public function broadcastWith()
{
return [
'actionId' => $this->actionId,'actionData' => $this->actionData,'sender'=>$this->user
];
}
}
socket.js 文件
'use strict';
var cors = require('cors');
var app = require('express')();
app.use(cors({origin: '*'}));
var server = require('http').Server(app);
var io = require('socket.io')(server);
require('dotenv').config();
io.on('connection',function(socket) {
console.log('connected'+socket.id);
});
var redisPort = process.env.REdis_PORT;
var redisHost = process.env.REdis_HOST;
var ioRedis = require('ioredis');
var redis = new ioRedis(redisPort,redisHost);
redis.subscribe('test_database_action-channel-one');
redis.on('message',function (channel,message) {
message = JSON.parse(message);
console.log(message);
io.emit(channel + ':' + message.event,message.data);
});
var broadcastPort = process.env.broADCAST_PORT;
server.listen(broadcastPort,function () {
console.log('Socket server is running.');
});
客户端
var sock = io("http://127.0.0.1:3444",{
transports: ['websocket']
});
var sender = "{{ auth()->check() ? Auth::id() : 'false' }}";
sock.on('test_database_action-channel-one:App\\Events\\DashboardEvent',function (data) {
console.log(data);
var action = data.actionId;
var actionData = data.actionData;
var user = data.sender;
//if sender
if (user == sender) {
console.log('this is the sender');
}
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)