如何从 Raku 中的 IO::Socket::Async 接收一行?

zen*_*nix 4 raku

所以,我有这个:

    my $conn = await IO::Socket::Async.connect('127.0.0.1', 12340);  
    $conn.print: "GET /rest HTTP/1.1\r\n\r\n";
Run Code Online (Sandbox Code Playgroud)

如何只接收来自服务器的第一行?

我可以使用whenever并在其中添加一些逻辑,但有一个更简单的方法,对吗?

Jon*_*ton 6

如果您确实只想要第一行,而不关心响应的其余部分,那么您可以这样做:

my $first-line = await $conn.Supply.lines.first;
Run Code Online (Sandbox Code Playgroud)

也就是说,获取Supply表示响应流的 ,将其分成几行(这会产生一行Supply),并获取到达的第一行。任何超出第一行的数据都将被丢弃。

IO::Socket::Async其工作原理是在数据包到达时提供数据包。它不涉及提供面向线路的接口;如果一个协议确实像逐行读取那么简单,那么 areact whenever $conn.Supply.lines -> $line { }就会做到这一点(并正确处理按数据包分割的行)。