Nano Hash - криптовалюты, майнинг, программирование

javascript прослушивает несколько каналов сокетов с эхом

Я пытаюсь написать приложение для чата. Я использую (на стороне сервера): php laravel 5.4 и pusher и (на стороне клиента) vue.js и laravel-echo.

Я уже создал одну чат-группу, что такое «публичный чат». Сейчас работаю над приватными чатами.

Мой вопрос: как лучше (на стороне клиента) прослушивать все каналы комнат, к которым принадлежит пользователь.

Моя цель: проверить это (как на веб-странице мессенджера facebook) на всех каналах частных и общих комнат.

Теперь у меня есть это в chat-window компоненте:

created() {
  axios.get('/chatroom').then(response => {
      this.chatRooms = response.data;
      console.log('get /chatroom response: ' + response.data);
  });

  axios.get('/messages').then(response => {
      this.messages = response.data;
      console.log('get /messages response: ' + response.data);
  });

  Echo.join('chatroom')
      .here((users) => {
          this.usersInRoom = users;
      })
      .joining((user) => {
          this.usersInRoom.push(user);
      })
      .leaving((user) => {
          this.usersInRoom = this.usersInRoom.filter(u => u != user)
      })
      .listen('MessagePosted', (e) => {
          this.messages.push({
              message: e.message.message,
              user: e.user
          });
      });
  }
});

Но это слушает только канал chatroom. Как клиент может прослушивать все чаты (this.chatRooms)?

Заранее благодарим за ответы!


  • ты решил это? 28.09.2017
  • Спасибо за вопрос, да, я напишу решение. 29.09.2017

Ответы:


1

Итак, я понял, что у каждого пользователя должен быть свой канал.

Затем я изменил свой chat-window компонент:

<template lang="html">
  <div class="panel panel-default">
      <div class="panel-heading" style="height: 60px">
        <chat-room-picker :chatrooms="chatRooms" :newmessage="newmessage" :defaultchatroomid="pickedchatroomid" class="pull-left" v-on:chatroompicked="chatroompick"></chat-room-picker>
        <chat-room-creator class="pull-right"></chat-room-creator>
      </div>
        <chat-room :chatroomid="pickedchatroomid" :newmessage="newmessage"></chat-room>
  </div>
</template>

<script>
export default {
  data() {
    return {
     userId: loggedUserFS.id,
     userName: loggedUserFS.name,
     chatRooms: chatRoomsFS,
     pickedchatroomid: defaultChatRoomIdFS,
     newmessage: {},
    }
 },
 methods: {
   chatroompick(id) {
     this.pickedchatroomid = id;
   },
 },
 created() {
  // this.getCookiesParams();
  var tmp = this.chatRooms[0];
  this.pickedchatroomid = tmp.id;
   var channelName = 'chat-' + this.userId;
   console.debug(channelName + ", channel init.");
   window.Echo.join(channelName)
       .listen('NewMessageEvent', (e) => {
           console.debug("incoming message on " + channelName + ": " + JSON.stringify(e));
           console.debug(e.message.chatRoom_id + "==" + this.pickedchatroomid);
           console.debug(channelName +" : "+ e.message.chatRoom_id + "==" + this.pickedchatroomid);
           // TODO: finish it
           if(e.message.chatRoom_id == this.pickedchatroomid) { // if the reciced message comes from the pickedchatroom
             console.debug("reciced message comes from the pickedchatroom!");
             this.newmessage = e;
           } else { // if the reciced message does not come from the pickedchatroom
             this.newmessage = e;
           }
       });
  }
}
</script>

<style lang="css">
</style>

Я сделал chat-room-picker что-то выпадающее, и с его помощью вы можете менять чаты. И есть компонент chat-room для отображения сообщений текущего чата. В обоих компонентах есть vue-watch-es, и новое сообщение изменено, чат-комната добавляет сообщение (если сообщение принадлежит текущей чат-комнате), иначе ничего не делайте, и chat-room-picker начинает мигать, если сообщение принадлежит в другую комнату.

chat-room-picker часы:

  watch : {
    newmessage : function (value) {
      var message = value;
      var picker = $(".chatRoomPicker");
      //TODO: check that the message belongs to current chat room
      picker.addClass("blink");
      picker.on("click", function() {
        picker.removeClass("blink");
      });
    }
  }

Контрольная часть компонента чат-комнаты:

  watch : {
    chatroomid : function (value) { // if chat-room is changed
      this.getChatRoomMessages();
    },
    newmessage : function(value) {  // TODO: here or parent component check the room of the message
      console.debug("newmessage received:" + JSON.stringify(value));
      var msgTmp = value.message;
      msgTmp.user = value.user;

      this.messages.push(msgTmp);
    }
  },

на стороне сервера (в контроллере):

broadcast(new NewMessageEvent($message, $user, $usersOfChatRoom));

а мой broadcastOn метод NewMessageEvent выглядит так:

public function broadcastOn()
{
    $channels = [];
    foreach ($this->usersOfChatRoom as $addressee) {
      if($addressee->id != $this->user->id) {
        array_push($channels, new PresenceChannel('chat-' . $addressee->id));
      }
    }
    Log::debug("broadcastOn channels: " . json_encode($channels));
    return $channels;
  //
}

Я знаю, что это не закончено, но я прокомментировал, где нужно закончить код.

Возможно, это не самый элегантный способ, но он работает. Если у кого-то еще есть другое решение, пожалуйста, поделитесь им!

29.09.2017
  • поэтому всякий раз, когда вы транслируете событие a, допустим, чат, в котором находятся N пользователей. вы транслировали событие N раз? каждый раз каждому пользователю приватный канал? edit ну на самом деле n-1 из-за пользователя, отправившего сообщение 29.09.2017
  • Привет! Я обновил свой ответ. Да. Итак, когда один клиент создает сообщение, оно отправляется на сервер, где сервер транслирует его другим участникам чата. 29.09.2017
  • Спасибо. Возникли проблемы с этим, потому что я думал, что должен быть лучший способ, но, по-видимому, передача сообщения N-1 раз - это способ. Удачи в будущем! 29.09.2017
  • Я рекомендую вам проверить, как работает страница мессенджера facebook: www.messenger.com. У вас есть идентификатор, и я уверен, что у вас есть собственный канал, на котором слушает ваш клиент. Это натолкнуло меня на мысль. :) Желаю того же! 29.09.2017
  • @LakiGeri Я сделал то же самое. и все работает, но у меня задержка в [1–1,5] секунды для получения чатов. Как насчет твоего дела? Я попытался отправить сообщение на 200 пользовательских каналов. Пожалуйста, ознакомьтесь с моими реализациями группового чата с использованием pusher & socket .io github. com / rameezrami / laravel-socket-io-group-chat github.com / rameezrami / laravel-pusher-групповой чат 18.10.2019
  • @RameezRami, если честно, это было мое первое приложение для подключения к чат-сокету. В настоящее время я не работаю с php, поэтому ничем не могу вам помочь. Извините! 25.11.2019
  • @LakiGeri разобрался, задержка была в мосте Redis - SocketServer. работает все как положено сейчас 26.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..