Raku中如何仅接收IO::Socket::Async返回的单行响应数据
Raku异步Socket仅获取响应第一行的最简实现
原有代码
当前已编写的异步连接与请求发送代码如下:
my $conn = await IO::Socket::Async.connect('127.0.0.1', 12340); $conn.print: "GET /rest HTTP/1.1\r\n\r\n";
最简方案(无需自定义whenever逻辑)
直接利用IO::Socket::Async的Supply内置行分割方法即可,不需要自己维护接收缓冲区、判断换行边界,代码如下:
my $conn = await IO::Socket::Async.connect('127.0.0.1', 12340); await $conn.print: "GET /rest HTTP/1.1\r\n\r\n"; # 等待接收第一行响应 my $response-first-line = await $conn.Supply.lines.head; # 不需要后续数据就主动关闭连接释放资源 $conn.close;
逻辑说明
$conn.Supply:获取Socket对应的字符流供应,默认按UTF-8解码,需要其他编码可传入:enc<编码名>参数.lines:内置的行分割转换器,自动识别\r\n、\n换行符,自动处理TCP传输的粘包、半包问题,无需手动维护接收缓存.head:取流中第一个元素(即第一行内容),拿到结果后会自动终止后续流的监听,不会持续接收多余数据- 前置
await:等待第一行数据接收完成后返回结果,可直接赋值给变量使用
方案优势
如果用whenever自定义实现,需要自行维护接收缓冲区、每次收到数据扫描换行符、匹配到第一行后手动取消订阅,重复实现了Raku内置已经封装好的流处理逻辑,代码冗余且容易出边界bug,直接用内置的lines.head是最简洁也最稳妥的方案。
内容的提问来源于stack exchange,提问作者zentrunix
相关产品推荐
相关产品推荐

