[英]socket.io with Laravel not catching connection
这是我的客户端代码:
<script type="text/javascript">
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$("#send").click(function(){
content = $("textarea").val();
$.ajax({
url: "{{route('send.message')}}",
method: "POST",
data: {content},
success: function(){
socket.emit('message', content);
}
});
});
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
<script>
var socket = io('http://localhost:3000');
socket.on("channel:App\\Events\\EventName", function(message){
console.log(message);
});
</script>
节点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('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.log('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.log("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on Port 3000');
});
Laravel PHP服务器端(ajax目标):
public function sendMessage(Request $request){
event(new EventName($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
在客户端,它返回正在发送的数据,您可以在socket.on(......)
看到,我试图做的是,一旦消息通过ajax发送,我想发出该消息使用socket.emit()
,并将其捕获
io.on('connection', fuction(socket)({
});
但是它不能在那里捉住它。 这是为什么? 我正在尝试将消息广播到除我的套接字以外的其他套接字。 确切地说是这样
io.broadcast.emit()
请如何使它工作? 谢谢。
响应@Laravelmeester抱歉,我确实设置了我的活动。 但是我没有在代码中发布它。 我在这里有这个问题:
当我让socket.io在redis回调函数中进行监听时,如下所示:
redis.on('message', function(channel, message) {
console.log(message); //look here
socket.broadcast.emit('message', "huhu");
io.on('connection', function(socket) {
socket.on('message', function(data) {
console.log(data);
socket.broadcast.emit('message', data)
});
});
});
当我console.log(message)
它输出3-4x? 为什么这样做呢? 我只有一个客户端连接。 例如,我发送
test123
,它将输出
test123
test123
test123
您缺少许多要素,或者也许您已将其放置在适当的位置,但未在问题中发布。
我想你是和工匠一起做的事吗?
php artisan make:event SendSocketMessage
之后,它应该看起来像这样,请确保在构造中添加$ data var并将其传递给broadcastOn()中的正确频道。
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class SendSocketMessage implements ShouldBroadcast
{
use SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['test-channel'];
}
}
确保您已运行redis服务器并且正确设置了nodejs并保持终端打开以查看结果。 您会看到我使用了laravel log函数,因为您可以拖尾laravel日志并测试Construct函数和broadcatOn函数,以查看您的数据是否来自此事件。
现在,在您的控制器中,在其中触发sendMessage函数的顶部,您需要包括App \\ Event和eventname,如下所示:
use Event;
use App\Events\SendSocketMessage;
然后像这样重写函数:
public function sendMessage(Request $request){
Event::fire(new SendSocketMessage($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
还要在前端console.log message.data并查看是否正在记录日志。
希望这可以帮助。 祝你好运!
-
请分享您在控制台日志中得到的信息,其中您的NodeJS位于其中,其中包含已接收的邮件+邮件参数表:
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('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.log('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.log("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on Port 3000');
});
那还会输出3-4x吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.