结合Laravel和Socket.io
打赏作者

newborn
var redis = new Redis({
    host: '172.168.30.253', port: 6379,
});

可以通过这样指定redis的地址,包括密码

yangfuzhang 回复 newborn

var redis = new Redis({
host: ‘172.168.30.253’, port: 6379,
});

shine

如果不是集群,可以只BIND 本地IP,这样就不用密码了吧

gelove

**还想问怎么没看到redis的配置呢

mostwin

{user} 不解析

JellyBool 回复 mostwin

看看 vue dev-tool 和 chrome dev-tool 有什么报错么?

mostwin 回复 JellyBool

我用的2.1.10 换成1.0.4就没问题了

JellyBool 回复 mostwin

OK,恩。阔以

xiaofengzhi 回复 JellyBool

这个绑定ip: let socket = io(‘127.0.0.1:8000’);可以用本地的吗?我用了本地的ip不能监听吗?

jasester

我用的 laravel5.4 但是客户端不显示,也不抱任何错?

caiqihuang 回复 jasester

把welcome.blade.php里面的socket.io.js的引用换成和package.json用的socket.io一样的版本就可以了。

乔泓恺-Jone 回复 caiqihuang

我换成同样的版本啦 可是还是不显示

天山网艾克
~/redis $ node socket.js
events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::3000
    at Object.exports._errnoException (util.js:1026:11)
    at exports._exceptionWithHostPort (util.js:1049:20)
    at Server._listen2 (net.js:1257:14)
    at listen (net.js:1293:10)
    at Server.listen (net.js:1389:5)
    at Object.<anonymous> (/Users/abdureshid/redis/socket.js:15:6)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3

出现了以上报错, socket代码如下:

var http = require('http').Server();
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

redis.subscribe('test-channel');

redis.on('message', function (channel, message) {
    console.log(channel + ':' + message);
});

http.listen(3000);

route 文件测试代码如下:

use Illuminate\Support\Facades\Redis;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/

Route::get('/', function () {
    $data = [
        'aNewMessage',
        'data'=>[
            'name'=>'test-name'
        ]
    ];
    Redis::publish('test-channel',json_encode($data));
});

不知道怎么解决 @jellybool

JellyBool 回复 天山网艾克

这种 node 的报错通常特别诡异,你的 node 版本和 socketio 的版本是多少?laravel 的版本呢?

在什么环境下运行的?homestead?

天山网艾克 回复 JellyBool

laravel 5.3
nodejs 6.9.1
"ioredis": “^2.5.0”,
socket.io”: “^1.7.3”

JellyBool 回复 天山网艾克

3000 端口被占用了么?

天山网艾克 回复 JellyBool

我刚查了一下 是被占用了,现在可以访问了, 我用的VirtualBox 虚拟机 不是homestead

天山网艾克 回复 JellyBool
 Redis::publish('test-channel',json_encode($data));

这个包是不是跟 laravel 5.3 不太兼容啊, 就卡到这儿 504 Gateway Time-out 错误! socket.js 运行正常!

JellyBool 回复 天山网艾克

应该不会的吧。。。这个可能是你的配置问题吧。

天山网艾克 回复 JellyBool

/config/ broadcasting.php 这个文件里的配置改成redis 就出现超时情况,真不知道咋配置, 再说 laravel5.3 关于redis 的配置可不少, 广播你在laravel 5.3上测试过吗 ?刚测试5.2 是正常的 5.3 就是不行

jasester

laravel 5.4.16
nodejs 6.10.1
"ioredis": “^2.5.0”,
socket.io”: "^1.7.3"
环境:windows64位,phpstudy
客户端不显示任何东东,也不报错,求解? 代码是按照视频去写的

sangda

我用的laradock, 在workspace中执行的node socket.js,客户端io连接指定的ip地址应该是哪一个?

wwhu668

服务端ok

浏览器一直接收不到信息 「没有报错」

                socket.on('test-channel:aNewMessage', function (data) {
                    //一直运行不到这里
                    console.log(22)
                    //this.users.push(data.name);
                }.bind(this));

浏览器 Network 里一直在请求,然后浏览器蹦了

全部注释掉,只留下这句

    var socket = io('192.168.10.10:3000');

问题一样,一直在请求

_Tpw_Online 回复 wwhu668

解决了吗?我也是一直在请求

caiqihuang

有一个问题有点搞不懂。为什么刷新后刷新的那个浏览器看不到信息,而另一个浏览器能看到信息呢。

b545798400

这个可以实现单对单的私密聊天吗,如果实现的话,人数一多,subscribe监听的channel会变得越来越多,这样会不会变得很卡。

zhenzihui

这个和laravel Echo有什么区别?

乔泓恺-Jone

[ioredis] Unhandled error event: Error: connect ETIMEDOUT
at Socket. (/Users/Jone/sites/redis/node_modules/ioredis/lib/redis.js:289:21)
at Object.onceWrapper (events.js:314:30)
at emitNone (events.js:105:13)
at Socket.emit (events.js:207:7)
at Socket._onTimeout (net.js:402:8)
at ontimeout (timers.js:488:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:283:5)

“ioredis”: “^3.1.4”,
socket.io”: “^2.0.3”

laravel 5.5

麻烦请问 这个问题是什么导致的呢?

乔泓恺-Jone 回复 JellyBool

好的 我先看看 谢谢

sangda

以视频中的示例来讲,打开两个页面redis.dev,两个页面都有socket客户端监听,刷新其中一个页面,为什么只有另一个页面监听到数据,而不是两个页面同时接收到数据?

JellyBool 回复 sangda

为什么只有另一个页面监听到数据

这个数据指的是什么?

sangda 回复 JellyBool

用视频中的示例来说,打开两个redis.dev页面,刷新左边的页面,右边的页面就会出现Jelly这条数据,理论上来说两个页面都有socket客户端监听,应该两个页面同时出现Jelly这条数据才是

JellyBool 回复 sangda

你试着打开 三个页面,然后看看是不是另外两个页面有数据,还是三个都有。

sangda 回复 JellyBool

打开三个页面,刷新其中一个,只有另外两个页面有数据

sangda 回复 JellyBool

也就是说发起广播的客户端接收不到自己发出的数据

JellyBool 回复 sangda

嗯,这个应该是因为你刷新页面的时候,刷新的这个页面直接 return 的视图,然后再解析 js ,监听 socket。(但是这时候,socket 数据应该分发完了,所以刷新的这个页面是没有获取到数据的。我觉得是这样)

sangda 回复 JellyBool

嗯,这样可以解释得通,多谢,继续学习了,有问题再来请教。

xrpeng

服务端socket redis.subscribe()频道订阅 只能写死在那,没有其它办法了吗?

JellyBool 回复 xrpeng

一样是可以作为参数的吧

xrpeng 回复 JellyBool

解决了 订阅所有频道

xrpeng

加了https证书之后,一直报错 net::ERR_CONNECTION_CLOSED ,这个问题怎么解决???

JellyBool 回复 xrpeng

你是显示生产环境?

liujun

浏览器只显示:

{user}

都是最新版本

foxriver123

受益匪浅,好东西! @jellyBool 为什么你的东西都是那么酷!你是怎么知道的呢,github上找吗,但是那么多东西,你如何过滤呢,或者有什么好的社区之类的。

JellyBool 回复 foxriver123

这个需要自己平时注意收集