首页 > 解决方案 > 带有 Laravel 的 socket.io 没有捕获连接

问题描述

这是我的客户端代码:

 <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 时?为什么这样做?我只连接了一个客户端。所以例如我发送

测试123

,它会输出

test123
test123
test123

标签: laravelsocket.io

解决方案


您缺少很多元素,或者您可能有这些元素但未在您的问题中发布。

我想你和工匠一起做了一个活动?

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 log 并测试结构和 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-4倍吗?


推荐阅读