首页 > 解决方案 > 我的 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(稳定版)

标签: flutterhttpdartwebsocket

解决方案


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


推荐阅读