我想用 Flutter 做一个 aria2 的下载器,在 aria2 文档中,我看到可以使用 http 或者 websocket 发送请求。
我使用 http ,发送 post 请求,aria2 版本是 1.37.0 ,发现无论发不发送请求,第十秒之后发送请求必定卡住,于是我换了一个 aria 的修改版,这个版本不会阻塞在第十秒,但是会卡在下载任务上,浏览器使用了 aria2 Explorer ,发送下载任务就直接卡住,后面问了一下 AI ,说可以修改一下 conf ,修改之后发送下载任务不会卡住,但会在下载过程中卡住。我在 aria2 日志中并没有发现卡住以及卡住之后的请求。Dio 也是一样
但是卡住之后,重启程序就会恢复正常,aria2 的下载任务会继续下载,再次发送下载任务也不会卡住。
使用 websocket 也是一样会卡住。
我使用了 bun axios 发送 post 请求就不会卡住,但是使用 bun websocket 则无法连接,询问 AI ,告诉我说 aria2 并不支持 websocket ,而是 flutter 的 websocket 降级成了 http 。
// aria2.conf
file-allocation=none
enable-direct-io=true
rpc-max-request-size=2M
rpc-save-upload-metadata=true
disk-cache=16M
file-allocation=trunc
//dart
final client = http.Client();
final response = await client
.post(
Uri.parse(aria2Url),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'jsonrpc': '2.0',
'method': method,
'params': params,
'id': '1',
}),
)
.timeout(Duration(seconds: 1));
print(response.body);
client.close();
使用过 http 、Dio 、web_socket_channel(+json_rpc_2)等包发送请求均会卡住。 询问 AI 后,说 flutter 的 http 会 keep alive ,发送太多请求可能会阻塞,于是我在每次发送请求的时候都新建 client ,收到请求后 close ,但是并没有效果。 加入 timeout 之后,卡住的请求和之后的请求都会超时,但 aria2 仍旧一直处在卡住的状态。