【问题标题】:Unexpected websocket requests after my http requests我的 http 请求后出现意外的 websocket 请求
【发布时间】:2021-08-05 13:43:45
【问题描述】:

当我在 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(稳定版)

【问题讨论】:

    标签: flutter http dart websocket


    【解决方案1】:

    这是因为 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)。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 2019-01-22
      • 2016-07-05
      • 2017-07-17
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多