Cro::WebSocket::客户端不起作用



创建了一个带有"cro-sub"的websocket服务器。

写信给这个客户:

use v6;
use Cro::WebSocket::Client;
constant WS-PORT = '20000';
constant WS-ADDRESS = 'localhost';
constant WS-PATH = 'chat';
constant WS-URL = 'ws://' ~ WS-ADDRESS ~ ':' ~ WS-PORT ~ '/' ~ WS-PATH;
constant TIMEOUT-TO-CONNECT = 5; # seconds
my $timeout;
my $connection-attempt;
await Promise.anyof(
$connection-attempt = Cro::WebSocket::Client.connect(WS-URL),
$timeout = Promise.in(TIMEOUT-TO-CONNECT));
if $timeout.status == Kept
{
say "* could not connect to server in ', TIMEOUT-TO-CONNECT, ' seconds";
exit 1;
}
if $connection-attempt.status != Kept
{
say "* error ", $connection-attempt.cause,
" when trying to connect to server";
exit 1;
}
my $connection = $connection-attempt.result;
my $peer = WS-ADDRESS ~ ':' ~ WS-PORT;
say '* connected with ', $peer;
my $counter = 0;
my $message-supplier = Supplier::Preserving.new;
my $has-message-to-send = $message-supplier.Supply;
$message-supplier.emit(1);
react
{
whenever $has-message-to-send
{
$counter++;
$connection.send($counter);
say "* ok, sent message ", $counter, " to server"; 
}
whenever $connection.messages -> $reply
{
say '* received reply=[' ~ $reply ~ '] from server';
$message-supplier.emit(1);
}
} # react

我使用tcpdump看到了来自服务器的响应代码101(切换协议(,但没有看到从客户端发送到服务器的消息。

那么,我做错了什么?

另一个问题是,"$connection.send"不应该返回Promise之类的吗?如果发送时出现错误怎么办?

另一个问题:服务器似乎只了解IPV6地址。。。如何让它理解IPV4地址?

现在就这样。


更新

根据Takao的建议,更改

$connection.send($counter)

$connection.send($counter.Str)

解决了这个问题(尽管我在另一个程序上尝试过,而不是这个程序(。

让我们逐一解决这个问题。

首先,您的代码在我看来是正确的,除了一些小部分。

当我复制您的代码时,它确实不起作用,所以我用cro trace .而不是cro run .进行了尝试。你可以在官方文档中找到有关该模式的信息。另一种方法是只设置CRO_TRACE=1环境变量。

所以在调试过程中,我看到了这个错误: [TRACE(anon 1)] Cro::HTTP::ResponseParser QUIT No applicable body serializer could be found for this message 正如上面所说,您发送的正文无法序列化。所以我查看了您发送的内容:$counter。您的代码中的$counterInt,所以我们之前需要将其设置为Str,执行简单的$counter.Str可以使您的示例正常工作。

此外,请注意,您在每个回复中都会发送一条消息,echo服务器(使用cro stub创建的默认服务器(也会为每个传入消息发送一条回复,因此您的示例会无休止地发送消息。为了防止这种情况,你可以考虑添加一个条件,在这个条件下你将不再发送东西,但好吧,无论如何,这是一个测试示例,所以由你自己决定。

至于你的其他问题:

另一个问题,"$connection.send"是否应该返回Promise或其他什么?

不应该,我将写下一些cro的架构细节来解释它。正如您在阅读文档时可能知道的,cro管道基本上只是一堆Cro::Transform包装的供应。在Cro::Websocket::Client::Connection内部,send方法只是将一个东西直接发送到整个管道的Cro::Source中,一个简单的$supplier.emit($message)不会出错(该方法的实际实现看起来非常接近这一行(。你遇到的事情还在酝酿中。我确信隐藏这种情况的异常不是一个好的用户体验,所以我会考虑制作一个补丁来传播异常,这样更容易捕捉(尽管你总是可以使用调试模式(。

服务器似乎只了解IPV6地址。。。如何让它理解IPV4地址?

我不确定,请打开一个新问题。

最新更新