BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Ratchet send a message to the clients on X seconds
sly_one
Публикувано на: 11-12-2017, 12:43
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 167
Регистриран на: 24.10.11



Използвам Ratchet и искам да изпратя съобщение до клиентите на всеки X секунди. Моят сървър е:
CODE

  $server = IoServer::factory(
       new HttpServer(
           new WsServer(
               new Chat()
           )
       ),
       8080
   );

   $server->run();


опитах с:
CODE

while (true) {
       $this->sendData($client,'test message data');
       usleep(5000000);
  }


и
CODE

$clients = $this->findRoomClients($roomId);

   $dataPacket = array(
           'type' => 'ping',
           'data' => array(
               'roomId' => $roomId,
               'from' => 'System',
               'message' => 'You are pinged.',
               'clients' => $clients
           )
 );

  $loop = Factory::create();
  $loop->addPeriodicTimer(5, function ($clients, $dataPacket){
     echo 'periodic timer';
      $this->sendDataToClients($clients, $dataPacket);
 });

 public function sendDataToClients($clients, $message)
{
  foreach ($clients as $client) {
     $this->sendData($client, $message);
  }
}


Но без успех. Как websocket server да изпрати съобщение до клиентите на всеки X секунди?
PMEmail Poster
Top
hristonev
Публикувано на: 11-12-2017, 13:00
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 435
Регистриран на: 19.09.17



Мисля, че ви трябва pusher interface. Не сте упоменал коя библиотека ползвате. Тук има описание как се изгражда.
PMEmail Poster
Top
sly_one
Публикувано на: 11-12-2017, 14:41
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 167
Регистриран на: 24.10.11



Ratchet се използва, разглеждах и Push Integration, който предлагате, но там не виждам точно реализирана функционалността за изпращане на съобщения на клиентите на всеки Х секунди. Там примера включва абониране за тема и след това изпращане на съобщение до клиентите. Нещо друго е.

Това мнение е било редактирано от sly_one на 11-12-2017, 14:44
PMEmail Poster
Top
hristonev
Публикувано на: 11-12-2017, 15:14
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 435
Регистриран на: 19.09.17



Анонимната периодична функция, нали се изпълнява? Ако да след това се вика пушера, и евентуално за даден потребител му се праща съобщение. Така е изградено при мен. Само, че не съм на периодична функция. Периодичната я ползвам само да ми пингва базата icon_lol.gif , че иначе зависва конекцията.

Също така трябва да има и логове на сървъра. Ако дадете лог с грешка би било полезно.
PMEmail Poster
Top
sly_one
Публикувано на: 11-12-2017, 15:18
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 167
Регистриран на: 24.10.11



CODE

$loop->addPeriodicTimer(5, function ($clients, $dataPacket){
    echo 'periodic timer';
     $this->sendDataToClients($clients, $dataPacket);
});


тази функция само изпринтва 'periodic timer' на всеки 5 секунди. Може ли да ми покажеш какво по-конкретно трябва да се редактира тук с този Pusher, за да изпраща до всички клиенти даденото съобщение на всеки 5 секунди.
PMEmail Poster
Top
hristonev
Публикувано на: 11-12-2017, 15:39
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 435
Регистриран на: 19.09.17



Кода не е пълен. Това виждам аз. Няма я също и клиентската част JS.
След стартиране на сокет сървъра. Клиента трябва да се върже (тук говоря за javascript) от браузъра. Клиента обикновено се връзва към топик, който се дефинира по начина
CODE
class Pusher implements WampServerInterface
.
Това дали клиента има връзка със сървъра може да се види в конзолата на браузъра. При мен самата конекция ми сменя протокола 101 статус. от 80 на 8080 да кажем.

Също така при връзка на клиент в лог-а на сокет сървъра, също се очаква да има съобщение.
Прочетете/копирайте информацията на линка, който дадох и нещата би трябвало да заспят.
PMEmail Poster
Top
hristonev
Публикувано на: 11-12-2017, 15:42
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 435
Регистриран на: 19.09.17



ПП много е важно да работите в браузъра с това, което сте дефинирали. Така например при дефиниране на сървър 127.0.0.1, през браузъра http://localhost няма да работи. Трябва да се правят някакви алиаси...
PMEmail Poster
Top
relax4o
Публикувано на: 11-12-2017, 15:45
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2227
Регистриран на: 04.04.07



А от къде по-точно взимаш $clients в анонимната функция? Нещо логиката не ми се завърта тука.

П.П. Опитай така:

CODE

$loop->addPeriodicTimer(5, function () use ($clients, $dataPacket){
   echo 'periodic timer';
    $this->sendDataToClients($clients, $dataPacket);
});


Това мнение е било редактирано от relax4o на 11-12-2017, 15:48


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
sly_one
Публикувано на: 11-12-2017, 15:55
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 167
Регистриран на: 24.10.11



QUOTE (relax4o @ 11-12-2017, 15:45)
А от къде по-точно взимаш $clients в анонимната функция? Нещо логиката не ми се завърта тука.

П.П. Опитай така:

CODE

$loop->addPeriodicTimer(5, function () use ($clients, $dataPacket){
   echo 'periodic timer';
    $this->sendDataToClients($clients, $dataPacket);
});

Опитах и с use ($clients, $dataPacket, &$i), както казваш, но отново не ми се изпълнява таймера, т.е. нито принти, нито изпраща до клиентите $dataPacket.
PMEmail Poster
Top
sly_one
Публикувано на: 11-12-2017, 15:58
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 167
Регистриран на: 24.10.11



QUOTE (hristonev @ 11-12-2017, 15:39)
Кода не е пълен. Това виждам аз. Няма я също и клиентската част JS.
След стартиране на сокет сървъра. Клиента трябва да се върже (тук говоря за javascript) от браузъра. Клиента обикновено се връзва към топик, който се дефинира по начина
CODE
class Pusher implements WampServerInterface
.
Това дали клиента има връзка със сървъра може да се види в конзолата на браузъра. При мен самата конекция ми сменя протокола 101 статус. от 80 на 8080 да кажем.

Също така при връзка на клиент в лог-а на сокет сървъра, също се очаква да има съобщение.
Прочетете/копирайте информацията на линка, който дадох и нещата би трябвало да заспят.

Да клиентската част е ок. Имам предвид, че връзката се установява. Иначе разглеждах и примера от линка, който прати, но не знам как да го адаптирам. Там се използва връзка към Topic и след добавяне на запис се изпраща до всички клиенти съобщение, а в моя случай - правя чат система. Искам след като се логнат потребителите в чат стаята да се изпращат периодично (на всеки 5 секунди) съобщения до тези клиенти.
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0