首页 > 解决方案 > Ratchet Pawl:无法在循环中向 websocket 发送消息

问题描述

我需要从串口读取数据并将其发送到 websocket。我循环进入 a while,当一些数据到达时,我将其丢弃。

鉴于下面的代码,这是对Pawl 循环示例的一个非常小的修改,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();

标签: ratchetreactphp

解决方案


嘿 ReactPHP 核心团队成员。因此,我从您的示例中注意到一些事情应该使调试变得更容易。

  • 我们的 Promise 有两种主要的方法。a) 然后,b) 完成。then 可以被链接并用于执行一系列返回承诺的操作。done 不能并且被认为是链的结尾,当抛出错误但未在链中处理时,done 将追溯它。您的代码中有一些更改错误,但异常|可抛出被吞下。
  • 建议不要在事件循环中运行 while 循环,因为它会阻塞循环以及在其中运行的其他操作。(使用 也是如此sleep,您可以使用计时器再等待一秒钟。)
  • 您似乎正在为每条消息打开一个连接,打开单个连接并通过该连接将每条新消息推送到 websocket 服务器不是更有效吗?

推荐阅读