用"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
Run Code Online (Sandbox Code Playgroud)
我看到tcpdump来自服务器的响应代码101(切换协议),但我没有看到从客户端发送到服务器的消息.
那么,我做错了什么?
另一个问题,不要"$ connection.send"返回Promise或其他东西?如果发送时出错,该怎么办?
还有一个问题:似乎服务器只能理解IPV6地址......如何让它理解IPV4地址?
就是这样,现在.
UPDATE
根据Takao的建议,改变
$connection.send($counter)
Run Code Online (Sandbox Code Playgroud)
至
$connection.send($counter.Str)
Run Code Online (Sandbox Code Playgroud)
解决了这个问题(虽然我在另一个程序上尝试过,而不是这个程序).
让我们一块一块地解决这个问题.
首先,你的代码对我来说是正确的,除了几个微小的位.
当我复制你的代码时,它确实不起作用,所以我尝试了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
.$counter
在你的代码中Int
,所以我们需要Str
先做它,做简单$counter.Str
使你的例子工作.
另请注意,您正在每次回复时发送消息,并且回显服务器(您使用的默认设置cro stub
)也会为每个传入消息发送回复,因此您的示例会无休止地发送消息.为了防止这种情况,您可以考虑添加一个不再发送内容的条件,但是,无论如何,它都是一个测试示例,所以由您决定.
至于你的其他问题:
另一个问题,不要"$ connection.send"返回Promise或其他东西?
它不应该,我会写出一些cro的架构细节来解释它.正如您可能从阅读文档中了解到的那样,cro管道基本上只是一堆Cro::Transform
包装物品.在里面Cro::Websocket::Client::Connection
,send
方法只是将一个东西直接发送到Cro::Source
整个管道中,你就不会出错了$supplier.emit($message)
(这个方法的实际实现看起来非常接近这一行).你碰到的东西在管道中进一步发生.我确信隐藏这种情况的异常并不是一个很好的用户体验,因此我会考虑制作一个补丁来传播异常,因此它更容易捕获(尽管你总是可以使用调试模式).
似乎服务器只能理解IPV6地址......如何让它理解IPV4地址?
我不确定,请打开一个新问题.
归档时间: |
|
查看次数: |
153 次 |
最近记录: |