Socket.io с Laravel, не улавливающим соединение

Это мой код на стороне клиента:

 <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.info(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.info('Message Recieved: ' + message);
    message = JSON.parse(message);

    io.on('connection', function(socket) {
        console.info("made socket connection", socket.id);
    });

    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function() {
    console.info('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.info(message); //look here
    socket.broadcast.emit('message', "huhu");
    io.on('connection', function(socket) {
        socket.on('message', function(data) {
            console.info(data);
            socket.broadcast.emit('message', data)
        });
    });
});

Когда я console.info(message) выводит 3-4x? Почему это так? У меня подключен только один клиент. Так, например, я отправляю

test123

, он выведет

test123
test123
test123
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
2 667
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, потому что вы можете отслеживать свой журнал laravel и тестировать функции construct и broadcatOn, чтобы узнать, проходят ли ваши данные через это событие.

Теперь внутри вашего контроллера, где вы запускаете функцию sendMessage, сверху вам нужно включить App \ Event и имя события следующим образом:

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.info в файле 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.info('Message Recieved: ' + message);
    message = JSON.parse(message);

    io.on('connection', function(socket) {
        console.info("made socket connection", socket.id);
    });

    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function() {
    console.info('Listening on Port 3000');
});

Это тоже выводит 3-4x?

Привет, @Laravelmeester, Спасибо за ответ. Взгляните на мой вопрос, я добавил кое-что новое :)

Adis Azhar 09.07.2018 17:13

С вами можно связаться? Может через личное сообщение? @Laravelmeester

Adis Azhar 09.07.2018 17:17

Да, вы можете связаться со мной через личные сообщения, не беспокойтесь!

Laravelmeester 10.07.2018 10:08

О, глупый я. У меня недостаточно репутации, чтобы создать чат. Не могли бы вы меня пригласить? Спасибо!

Adis Azhar 10.07.2018 12:23

Другие вопросы по теме