flutter - 我的 http 请求后出现意外的 websocket 请求
问题描述
当我在飞镖或颤振中发出 http 请求时,总是会出现一个 websocket 请求。我想知道它是否来自包并编写了一个平面飞镖脚本,但它并没有解决问题。这是我写的脚本。
import 'dart:io';
main(List<String> args) async {
while (true) {
final client = HttpClient();
await Future.delayed(Duration(seconds: 10));
final req = await client.getUrl(Uri.parse('https://example.com/'));
await req.close();
client.close();
}
}
这是我调试的输出
它可能与httpclient有关,因为当我强制关闭它时,websocket请求结束而不是挂起。
那么问题是 websocket 请求发生的原因是什么?
Dart 版本:2.12.3(稳定版)
解决方案
这是因为 DevTools(出于某种原因)正在为 WebSocket 调用普通套接字。我已经创建了一个关于这种行为的问题,因为它令人困惑: https ://github.com/flutter/devtools/issues/3033
“网络”选项卡包含不同类型的事件,这些事件组合到同一概览中。在这种情况下,我们同时看到 HTTP 和套接字事件。
您首先看到 HTTP 事件的原因是,概览按每个事件的启动时间排序。对于 HTTP 事件,时间是在创建套接字之前开始的。
由于 HTTP 通信是使用套接字进行的,Dart VM 将尝试建立与您要与之通信的服务器的套接字连接。这个套接字的创建触发了一个事件,该事件被发送到 DevTools,关于一个新的套接字已经创建。
您看到的是这个套接字(错误地命名为 WebSocket)。建立此套接字后,HttpClient
然后使用它使用 HTTP 协议与服务器通信。
您看到可重复调用的多个 WebSocket(实际上是 Socket...)的原因是因为您正在HttpClient
循环中创建一个新对象。通常,您应该重用 ,HttpClient
因为它会自动使套接字保持活动状态 15 秒(默认值,并且可以配置),以防您要对同一服务器进行另一个 HTTP 调用。如果您这样做,您应该只看到在您的示例中创建了一个 WebSocket(但应该是 Socket)。
推荐阅读
- html - 为什么我的菜单不显示与代码相同的行?
- ios - 如何根据段宽调整 UISegmentedControl 字体大小?
- racket - 字符串前缀?\在模块中获取错误未绑定标识符
- python - numpy:用 2d 插值调整 3d 数组的大小
- javascript - 停止在本机反应中重新渲染特定视图
- python - 如何使用 Python 从 7z 文件中提取或读取 csv 文件?
- firebase - 使用 Firebase、Nodemailer 和 Zoho 发送邮件时出错
- c# - 使用 C# 进程执行批处理文件
- ios - 项目在 Swift 中时无法从 Objective-C 访问 swift 类
- splunk - Splunk:Splunk-python SDK:如何包含 pandas、numpy 来创建自定义命令