Храповик Паул: невозможно отправить сообщение в веб-сокет в цикле - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно прочитать данные с последовательного порта и отправить их в веб-сокет. Я зацикливаюсь на while, и когда приходят какие-то данные, я их выбрасываю.

Учитывая приведенный ниже код, который является очень маленькой модификацией из примера цикла Павла , send() никогда не выполняется, и я не могу понять, почему. Я попытался отправить код в автономном php, и он работает, но когда я добавляю его в цикл while, похоже, он никогда не выполняется. Я вижу отладку INVIO, но затем она возвращается к LOOP, и сообщение не передается.

Я пробовал даже более простой пример без цикла React, но ведет себя точно так же, send(), по-видимому, никогда не достигается.

        $loop = \React\EventLoop\Factory::create();
        $reactConnector = new \React\Socket\Connector($loop, [
          'dns' => '8.8.8.8',
          'timeout' => 10
        ]);
        $connector = new \Ratchet\Client\Connector($loop, $reactConnector);

        $loop->addPeriodicTimer(8, function () use($connector){
            echo "LOOP\n";
            do {
                sleep(1);
                $msg = $this->getSerial()->read();
//              $msg = $this->getSerial()->readPort();
                echo "LETTO <$msg>\n";
           } while (strlen($msg) < 50);
                echo "INVIO $msg\n";
                $connector('ws://127.0.0.1:9988')
                  ->then(function(Ratchet\Client\WebSocket $conn) {
                      $conn->on('close', function($code = null, $reason = null) {
                      echo "Connection closed ({$code} - {$reason})\n";
                  });

                  $conn->send('Hello World!');
                  $conn->close();
                }, function(\Exception $e) {
                  echo "Could not connect: {$e->getMessage()}\n";
                });
        });
        $loop->run();

1 Ответ

0 голосов
/ 19 марта 2019

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

  • У наших обещаний есть два основных метода. а) затем б) сделано. затем может быть соединен в цепочку и использован для выполнения ряда операций, которые возвращают обещание. Готово не может и считается концом цепочки, когда ошибка генерируется, но не обрабатывается в цепочке выполнено, приведет к ее возврату. В вашем коде произошла ошибка с изменением, но исключение | throwable проглочено.
  • Запрещается запуск цикла while внутри цикла событий, поскольку он блокирует цикл и другие операции, выполняемые внутри него. (То же самое можно сказать и о sleep, вы можете использовать таймер, чтобы подождать еще секунду.)
  • Похоже, вы открываете соединение для каждого сообщения, не будет ли эффективнее открыть одно соединение и передавать каждое новое сообщение на сервер веб-сокетов через это соединение?
...