在Laravel 5.3中使用Socket.io和Redis进行广播事件

时间:2016-12-13 12:08:54

标签: javascript node.js laravel sockets laravel-5

我正在尝试使用socket.io和Redis使用L5.3创建一个简单的事件广播选项。 服务器方面的工作正常,但在客户端不工作。 这是我的代码。

活动代码

public $data;

public function __construct($data)
{
    //
    $this->data = $data;
}

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PrivateChannel('test-channel');
}

Socket.js

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('test-channel', function(err, count) {
});
redis.on('message', function(channel, message) {
    console.log('Message Recieved: ' + message);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function(){
    console.log('Listening on Port 3000');
});

查看文件

<script type="text/javascript">
   var socket = io('http://localhost:3000');

    socket.on('test-channel: App\\Events\\SomeEvent', function(message) {
      alert("not yet reached here")
       jQuery('#dynamic_content').append(message.data.name);
   });
    </script>

事件消防代码

Route::get('test', function () {
    // Route logic...
    $data = array("id" => "1","name"=>"jobin" , "amount" => "1000");
    Redis::publish('test-channel', json_encode($data));
    event(new App\Events\SomeEvent($data));
     return "event fired";
});

当我访问 domain.app/test 时,节点服务器控制台已经输出如下结果。

Message Recieved: {"id":"1","name":"jobin","amount":"1000"}

我已经尝试了几个帖子,我仍然无法弄清楚我在这里缺少什么。

我的ENV

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=database
QUEUE_DRIVER=redis

唯一的问题是无法在客户端反映它,节点服务器的控制台和EventListener的句柄方法工作正常(我可以在那里转储数据)。

任何想法的人都会花6个小时来处理它。

已经尝试these 任何暗示都将受到高度赞赏。 谢谢。

1 个答案:

答案 0 :(得分:2)

私人频道会在名称前添加private_。在您的情况下,频道名称将为private_test-channel