首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cro::WebSocket::Client不工作

Cro::WebSocket::Client不工作
EN

Stack Overflow用户
提问于 2018-07-18 14:51:44
回答 1查看 256关注 0票数 5

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

这位客户写道:

代码语言:javascript
复制
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“不应该回报一个承诺或什么吗?如果发送时有错误怎么办?

还有另一个问题:服务器似乎只理解IPV6 addresses...how以使它理解IPV4地址?

就这样,暂时的。

更新

根据Takao的建议,改变

代码语言:javascript
复制
$connection.send($counter)

代码语言:javascript
复制
$connection.send($counter.Str)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-18 18:17:49

让我们一片一片地解决这个问题。

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

当我复制您的代码时,它确实不起作用,所以我尝试使用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可以使示例工作。

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

至于你的其他问题:

另一个问题,"$connection.send“不应该回报一个承诺或什么吗?

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

服务器似乎只理解IPV6 addresses...how以使它理解IPV4地址?

我不确定,请回答一个新的问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51405074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档