如何只向发件人广播?

问题描述

我知道广播是为了让其他人实时获取消息。但出于某种原因,我需要它只能由发件人接收。如何实现这一目标?现在,广播已被发送方的所有摘录接收。 我正在使用 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 (将#修改为@)