perl6 – Cro :: WebSocket :: Client不起作用
用“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地址? 就是这样,现在. UPDATE 根据Takao的建议,改变 $connection.send($counter) 至 $connection.send($counter.Str) 解决了这个问题(虽然我在另一个程序上尝试过,而不是这个程序). 解决方法
让我们一块一块地解决这个问题.
首先,你的代码对我来说是正确的,除了几个微小的位. 当我复制你的代码时,它确实没有用,所以我试着用它跟踪.而不是cro run ..你可以在official docs找到有关该模式的信息. 所以在调试期间我看到了这个错误: [TRACE(anon 1)] Cro :: HTTP :: ResponseParser QUIT没有找到适用于此消息的正文序列化程序 正如它所说,你发送的身体无法序列化.所以我调查了你发送的内容:$counter.你的代码中的$counter是Int,所以我们需要先把它变成Str,做简单的$counter.Str使你的例子工作. 另请注意,您正在每次回复时发送消息,并且回显服务器(使用cro stub创建的默认值)也会为每个传入消息发送回复,因此您的示例会无休止地发送消息.为了防止这种情况,您可以考虑添加一个不再发送内容的条件,但是,无论如何,它都是一个测试示例,所以由您决定. 至于你的其他问题:
它不应该,我会写出一些cro的架构细节来解释它.正如你在阅读docs时所知道的那样,cro管道基本上只是一堆Cro :: Transform包裹的用品.在Cro :: Websocket :: Client :: Connection里面,send方法只是将一个东西直接发送到整个管道的Cro :: Source,你就不会出错了简单的$supplier.emit($message)(真正的实现这个方法看起来非常接近这一行).你碰到的东西在管道中进一步发生.我确信隐??藏这种情况的异常并不是一个很好的用户体验,因此我会考虑制作一个补丁来传播异常,因此它更容易捕获(尽管你总是可以使用调试模式).
我不确定,请打开一个新问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |