【问题标题】:socket.io with Laravel not catching connection带有 Laravel 的 socket.io 没有捕获连接
【发布时间】:2018-07-09 14:28:46
【问题描述】:

这是我的客户端代码:

 <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

【问题讨论】:

    标签: laravel socket.io


    【解决方案1】:

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

    我假设你和工匠一起举办了一场活动?

    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-4x 吗?

    【讨论】:

    • 嘿@Laravelmeester,感谢您的回复。请看看我的问题,我添加了一些新内容:)
    • 可以联系到您吗?也许通过个人信息? @Laravelmeester
    • 可以,可以私信联系我,不用担心!
    • 哦,我真傻。我没有足够的代表来创建聊天室。你介意邀请我吗?谢谢!
    猜你喜欢
    • 2017-03-26
    • 2014-05-09
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2020-11-03
    • 2017-08-09
    相关资源
    最近更新 更多