Jan*_*ann 13 javascript sockets redis node.js laravel
所以我试图在帮助下播放Laravel 5 Events Redis.不,我不想使用服务,Pusher因为它不是免费的(即使免费限制对我来说足够了),我想保持对广播服务器的控制.
所以我到目前为止所做的是,我设置了一个redis服务器(监听端口6379 - >默认),我设置了以下事件:
class MyEventNameHere extends Event implements ShouldBroadcast
{
use SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return \App\Events\MyEventNameHere
*/
public function __construct()
{
$this->data = [
'power' => 10
];
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['pmessage'];
}
}
Run Code Online (Sandbox Code Playgroud)
我注册了一个到该事件的路线:
Route::get('test',function()
{
event(new App\Events\MyEventNameHere());
return "event fired";
});
Run Code Online (Sandbox Code Playgroud)
我创建了(更像是复制:P)节点套接字服务器:
var app = require('http').createServer(handler);
var io = require('socket.io')(app, {origins:'*:*'});
var Redis = require('ioredis');
var redis = new Redis();
app.listen(6379, function() {
console.log('Server is running!');
});
function handler(req, res) {
res.writeHead(200);
res.end('');
}
io.on('connection', function(socket) {
console.log(socket);
});
redis.psubscribe('*', function(err, count) {
});
redis.on('pmessage', function(subscribed, channel, message) {
console.log(message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
Run Code Online (Sandbox Code Playgroud)
我创建了实际接收广播的视图(testview.blade.php):
@extends('layout')
@section('content')
<p id="power">0</p>
<script>
var socket = io('http://localhost:6379');
socket.on("pmessage:App\\Events\\MyEventNameHere", function(message) {
console.log(message);
$('#power').text(message.data);
});
console.log(socket.connected);
</script>
@endsection
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地启动redis服务器.我可以启动节点socket.js服务器,我得到响应"服务器运行"
当我到达事件的路线时,我在浏览器中获得了返回"事件触发".
当我到达实际视图的路线时
Route::get('test/view',function()
{
return view('testview');
});
Run Code Online (Sandbox Code Playgroud)
我可以看到整个页面(呈现布局),并且webconsole不会显示任何错误.
但是,如果我发射事件,视图将不会改变,这意味着,广播没有收到正确的?
现在我为控制台添加了一个输出
console.log(socket.connected);
Run Code Online (Sandbox Code Playgroud)
哪个应该显示我是否client连接到socket.io右边?
嗯,输出说false.我在这做错了什么?
关于我的设置的更多信息:我在php内置服务器上运行整个项目,整个项目在Windows上运行(如果有可能的话),我的防火墙没有阻止任何端口.
编辑1:
我忘了说我的节点服务器也没有收到消息......它只说"服务器正在运行",没有别的.
编辑2:
我用了另一个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();
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
redis.subscribe('test-channel', function () {
console.log('Redis: test-channel subscribed');
});
redis.on('message', function(channel, message) {
console.log('Redis: Message on ' + channel + ' received!');
console.log(message);
message = JSON.parse(message);
io.emit(channel, message.payload)
});
io.on('connection', function(socket) {
console.log('a user connected');
socket.on('disconnect', function() {
console.log('user disconnected');
});
});
http.listen(3000, function() {
console.log('listening on *:3000');
});
Run Code Online (Sandbox Code Playgroud)
这次控制台收到消息.因此,如果节点socket.io收到消息,那么我的客户端出了什么问题?显然这些消息正在被正确播放,唯一的问题是它们没有被客户接收......
我不能说什么是完全错误的,可能没有人不能,因为你的问题是广泛和环境依赖.使用Wireshark Sniffer,您可以轻松确定部分无法正常工作的解决方案,然后尝试找到解决实际问题的解决方案.
如果您的问题是关于如何做到这一点,我建议不要在服务器端涉及节点并使用.NET或Java语言.