使用 Amp\Websocket 从开放流连接获取 websocket ping?
Get websocket pings from an open stream connection using Amp\Websocket?
我在这里使用自述文件示例:
https://github.com/amphp/websocket-client/blob/master/README.md
use Amp\Websocket;
use Amp\Delayed;
use Amp\Websocket\Connection;
use Amp\Websocket\Handshake;
use Amp\Websocket\Message;
use function Amp\Websocket\connect;
\Amp\Loop::run(function () use ($fn)
{
try
{
$connection = yield connect('wss://....');
yield $connection->send('{
"action":"authenticate",
"data":{
...
}
}');
while ($message = yield $connection->receive())
{
$payload = yield $message->buffer();
// print the payload
$this->info($payload);
// custom function to parse the payload
$r = $fn($payload);
if ($r == false) {
$this->warn('Connection closed.');
$connection->close();
break;
}
}
}
catch (\Throwable $e) {
$this->isError($e->getMessage(),true);
}
catch (\Exception $e) {
$this->isError($e->getMessage(),true);
}
});
问题:
当通过流发送消息时,while 循环只会 运行,没有消息,因为它处于空闲模式等待,所以什么都不会发生。
解决方法:
我如何接收 ping 或在 ping 上使用 while 循环 运行,并仍然收集消息?
例如,我想控制检查一些信息,(比如套接字应该保持打开)但是,它只能检查当消息通过流时,这限制了脚本,因为它只会在有 activity 时执行,因此如果没有发送任何信息,将永远等待。
Ping 是基于 RFC 的网络套接字中的标准:https://www.rfc-editor.org/rfc/rfc6455
在 Rfc6455Connection
连接 class 中,有 ping,但没有关于如何访问或直接使用它的文档。
运行 ping 的 while 循环并同时检查是否有消息,这可能很酷吗?
amphp/websocket-client
自动处理 ping 并对其作出响应,因此接收消息是 API 用户应该关心的唯一问题。
使用 Amp,您可以随时使用 Amp\call
/ Amp\asyncCall
生成多个协程,因此您可以空闲一段时间后关闭连接。
Loop::run(function () {
try {
$connection = yield connect($uri);
asyncCall(function () use ($connection) {
while (true) {
if (!$this->isActive()) {
$connection->close();
break;
}
yield Amp\delay(1000);
}
});
yield $connection->send('...');
while ($message = yield $connection->receive()) {
$payload = yield $message->buffer();
$r = $fn($payload);
if ($r == false) {
$this->warn('Connection closed.');
$connection->close();
break;
}
}
} catch (\Exception $e) {
$this->isError($e->getMessage(),false);
}
});
我在这里使用自述文件示例:
https://github.com/amphp/websocket-client/blob/master/README.md
use Amp\Websocket;
use Amp\Delayed;
use Amp\Websocket\Connection;
use Amp\Websocket\Handshake;
use Amp\Websocket\Message;
use function Amp\Websocket\connect;
\Amp\Loop::run(function () use ($fn)
{
try
{
$connection = yield connect('wss://....');
yield $connection->send('{
"action":"authenticate",
"data":{
...
}
}');
while ($message = yield $connection->receive())
{
$payload = yield $message->buffer();
// print the payload
$this->info($payload);
// custom function to parse the payload
$r = $fn($payload);
if ($r == false) {
$this->warn('Connection closed.');
$connection->close();
break;
}
}
}
catch (\Throwable $e) {
$this->isError($e->getMessage(),true);
}
catch (\Exception $e) {
$this->isError($e->getMessage(),true);
}
});
问题: 当通过流发送消息时,while 循环只会 运行,没有消息,因为它处于空闲模式等待,所以什么都不会发生。
解决方法: 我如何接收 ping 或在 ping 上使用 while 循环 运行,并仍然收集消息?
例如,我想控制检查一些信息,(比如套接字应该保持打开)但是,它只能检查当消息通过流时,这限制了脚本,因为它只会在有 activity 时执行,因此如果没有发送任何信息,将永远等待。
Ping 是基于 RFC 的网络套接字中的标准:https://www.rfc-editor.org/rfc/rfc6455
在 Rfc6455Connection
连接 class 中,有 ping,但没有关于如何访问或直接使用它的文档。
运行 ping 的 while 循环并同时检查是否有消息,这可能很酷吗?
amphp/websocket-client
自动处理 ping 并对其作出响应,因此接收消息是 API 用户应该关心的唯一问题。
使用 Amp,您可以随时使用 Amp\call
/ Amp\asyncCall
生成多个协程,因此您可以空闲一段时间后关闭连接。
Loop::run(function () {
try {
$connection = yield connect($uri);
asyncCall(function () use ($connection) {
while (true) {
if (!$this->isActive()) {
$connection->close();
break;
}
yield Amp\delay(1000);
}
});
yield $connection->send('...');
while ($message = yield $connection->receive()) {
$payload = yield $message->buffer();
$r = $fn($payload);
if ($r == false) {
$this->warn('Connection closed.');
$connection->close();
break;
}
}
} catch (\Exception $e) {
$this->isError($e->getMessage(),false);
}
});