ratchet - 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();
解决方案
嘿 ReactPHP 核心团队成员。因此,我从您的示例中注意到一些事情应该使调试变得更容易。
- 我们的 Promise 有两种主要的方法。a) 然后,b) 完成。then 可以被链接并用于执行一系列返回承诺的操作。done 不能并且被认为是链的结尾,当抛出错误但未在链中处理时,done 将追溯它。您的代码中有一些更改错误,但异常|可抛出被吞下。
- 建议不要在事件循环中运行 while 循环,因为它会阻塞循环以及在其中运行的其他操作。(使用 也是如此
sleep
,您可以使用计时器再等待一秒钟。) - 您似乎正在为每条消息打开一个连接,打开单个连接并通过该连接将每条新消息推送到 websocket 服务器不是更有效吗?
推荐阅读
- python - 我看不到结果。结果上有一种地址
- python - 我收到一条错误消息“KeyError”,Python,Telegram api
- android - Android 应用程序尝试打开 pdf 文件但立即被发回
- windows - 我的电脑!!!无法启动,说 '\Boot\BCD status:0xc000000f'
- python - 为什么即使文件清楚地存在于我的计算机上,python 也不会将其识别为我的数据集?
- android - 从 Internet 提取数据时出现错误
- python - 从一组单词中生成所有可能的正确句子
- python - 尝试使用多个名称条目清理调查结果,一些答案为 NaN
- c# - 如何在旋转平面内获得随机位置(由 X 和 Z 中的中心位置和大小创建)?
- c++ - FFmpeg + cpp,如何获取处理 h264_nvenc 的 GPU 列表?