我失去了近2天的谷歌搜索和搜索试图找出我的设置有什么问题。 我的所有服务都在Docker容器中运行,所有服务都已正确连接(我已经测试过了)
我在Node.JS上连接到Redis的最小Socket IO服务器:
require('longjohn');
require('dotenv').load({silent: true});
process.env = process.env || {};
var PORT = process.env.SOCKET_PORT || 4567;
var io = require('socket.io').listen(PORT);
var redis = require('socket.io-redis');
io.adapter(redis({
host: process.env.REDIS_HOST || 'redis',
port: process.env.REDIS_PORT || 6379
}));
io.on('connection', function (socket) {
console.log(`New connection!`);
}
当我在Redis上监控这段代码时,我得到了:
1520713149.833184 [0 172.20.0.8:40858] "info"
1520713149.833631 [0 172.20.0.8:40860] "info"
1520713149.834154 [0 172.20.0.8:40862] "info"
1520713149.839510 [0 172.20.0.8:40860] "subscribe" "socket.io#/#"
1520713149.840678 [0 172.20.0.8:40862] "subscribe" "socket.io-sync#request#/#"
然后连接并发送给Redis的php应用程序
<?php
require(__DIR__.'/vendor/autoload.php');
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => 'redis',
'port' => 6379,
]);
$client->connect();
$emitter = new SocketIO\Emitter($client);
$emitter->emit('event', 'payload str');
在Redis上:
"PUBLISH" "socket.io#emitter" "\x92\x83\xa4type\x02\xa4data\x92\xa5event\xabpayload str\xa3nsp\xa1/\x82\xa5rooms\x90\xa5flags\x90"
所以看起来所有人都来到了REDIS,但socket io服务器并没有因为未知原因而获得该事件。
我在考虑两者使用的不同渠道socket.io#emitter
,socket.io#/#
和socket.io-sync#request#/#
。但是我读过的所有文章都没有使用或改变它们。
所以也许这是一个不匹配的软件包版本?但是下面所有这个版本都被我的同事使用了......(我问他们这个问题,还在寻找)
在PHP上,我使用composer:
{
"require": {
"rase/socket.io-emitter": "^0.7.0",
"predis/predis": "^1.0"
}
}
在Socket IO Server上,npm with:
{
"dependencies": {
"dotenv": "~1.2.0",
"longjohn": "~0.2.9",
"socket.io": "~1.3.7",
"socket.io-redis": "^1.1",
}
}
如果有人有想法,我会非常感激;)
编辑:
我的同事使用Vagrant,我试着看看是否有什么不同,是的,socket.io服务器订阅的频道有所不同。
它是psubscribe" "socket.io#*
而不是socket.io#/#
,但他们没有触及任何关于它的内容,而且两者(码头工人和流浪者)的来源是一样的疯狂对吗?
答案 0 :(得分:0)
好的,将问题和解决方案分开。这里的问题是我对socket IO和Redis的误解和缺乏经验。
当客户通过Redis发送时,我应该有一个新的连接。 实际上,并非如此,新连接只会来自连接到IO套接字的客户端。 我使用DEBUG = *来查看服务器上发生的一切,确实是,套接字IO从REDIS获取信息。我是错误的,缺乏经验只关注频道名称。
我希望它能帮助Socket IO和Redis上的新padawan:)