我的 http 请求后出现意外的 websocket 请求
Unexpected websocket requests after my http requests
当我在 dart 或 flutter 中发出 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();
}
}
这里是我调试的output
它可能与 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 秒 (default, and can be configured),以防您要对同一服务器进行另一个 HTTP 调用。如果这样做,您应该只会看到在您的示例中创建了一个 WebSocket(但应该是 Socket)。
当我在 dart 或 flutter 中发出 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();
}
}
这里是我调试的output
它可能与 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 秒 (default, and can be configured),以防您要对同一服务器进行另一个 HTTP 调用。如果这样做,您应该只会看到在您的示例中创建了一个 WebSocket(但应该是 Socket)。