Amu*_*Ray 8 asynchronous perl6 cro
我正在使用IO :: Socket :: Async处理一个小项目.我正在尝试编写一些测试以确保我正确处理连接丢失,但我最初的尝试没有按计划进行.我认为使用QUIT移相器可以工作,但是在我尝试关闭供应的测试中没有给出任何响应,但这并没有给出我希望的结果.有人能指出我在如何使用IO :: Socket :: Async处理连接丢失的正确方向吗?
我尝试使用戒烟的供应示例如下.因为它没有按我的预期工作.我不确定我是否正确地做到了这一点.
supply whenever $connection -> $event {
if $event ~~ /event message/ {
emit { status => $event };
}
QUIT {
.note;
say 'conection lost';
}
}
Run Code Online (Sandbox Code Playgroud)
连接可以通过两种方式终止:
whenever认购很像一个循环,并LAST移相器触发流上的有序结束.所以,要处理这种情况,请使用LAST.QUIT您编写时触发(尽管您需要QUIT { default { note $_ } }实际处理它,就像使用CATCH).似乎相当多的案例被认为是"有序的"(即EOF案件),至少比我预期的要多.例如,运行如下服务器:
react {
whenever IO::Socket::Async.listen('localhost', 4242) -> $conn {
whenever $conn -> $stuff {
$conn.print($stuff);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的客户:
my $conn = await IO::Socket::Async.connect('localhost', 4242);
react {
whenever $conn -> $stuff {
say "Got back $stuff";
LAST {
say "Connection closed";
done;
}
QUIT {
default {
say "Connection lost: $_";
done;
}
}
}
whenever Supply.interval(1) {
$conn.print("hello $_\n");
}
}
Run Code Online (Sandbox Code Playgroud)
然后按Ctrl + C服务器,并且 - 至少在我的本地设置(VM中的Ubuntu) - 它触发了LAST.我想知道这可能是某种bug,所以一直追溯到VM的I/O绑定,不,我们真的在这种情况下从操作系统传递给我们EOF,而不是错误.将服务器粘贴在一台单独的计算机上,然后断开本地计算机上的wifi,足以触发QUIT"通过对等方重置连接"的情况.
总之,QUIT是处理错误连接丢失的正确方法,但是LAST由EOF触发,并且在某些情况下我们可能会考虑"连接丢失"; 只有在套接字顶部说出的协议才能真正确定这是否是事情即将结束的意外时间.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |