如何修复HttpException:在接收完整标头之前关闭连接

119

我最近在我的应用中升级了flutter版本。但当我想要调试应用程序时,它会显示以下错误:

连接服务协议出错:HttpException: Connection closed before full header was received, URI = http://127.0.0.1:50795/ws

是否有其他人在升级flutter版本后遇到相同的问题?如果有任何解决方法,请分享。


3
在我的情况下,flutter clean 起了作用。 - Stack Underflow
不幸的是,我在VS Code的终端中运行了“flutter clean”,但没有先关闭WIFI。现在我遇到了很多错误,比如runApp未定义,所有的build、.dart tool、.packages都被删除了。现在我该怎么办? - Suraj Oberai
在真实设备上启动小部件测试时遇到相同的错误。 - th_lo
19个回答

26

现在此问题已在 Github 上开放:https://github.com/flutter/flutter/issues/32587

暂时,您可以通过切换到物理设备而不是模拟器来解决此问题:如何使用 Android Studio 在真实设备上测试 Android 应用程序?

Github 上找到了决定(向上链接)

我现在有一个临时解决方案,可以暂时使用。上面的异常在我将模拟器运行为 Pixel 3 Android 9.+ Target (Q API) 时抛出。我创建了第二个模拟设备,一个 Pixel 2 Android 9.0 Target (28 API),并且这个目标可以正常工作。

我还注意到 Pixel 2 目标占用 8.5GB 的磁盘空间,而 Pixel 3 目标仅占用 1.4GB。这让我想知道 Pixel 3 目标是否缺少一些重要的东西。


46
切换到物理设备对我来说不起作用。我在iOS和Android物理设备上以及在iPhone模拟器上都遇到了同样的问题。 - i6x86
7
在物理设备上遇到同样的问题,有解决方案吗? - Sana.91
1
尝试使用另一个模拟器 - 例如创建Pixel 3 Android 9并在那里执行应用程序。 同时升级Flutter,如果没有帮助,请尝试运行并检查是否一切正常。 flutter doctor -v - awaik
@awaik将此作为单独的问题提出:https://dev59.com/R7bna4cB1Zd3GeqPfLBE - Sana.91
在Windows上相同 - Amine Da.
显示剩余2条评论

18

主要问题出在Android Q上。

你可以将你的安卓版本从Android Q降级到Android Pie,这最终会解决该问题。

这最终将帮助解决该问题。


1
iOS怎么样? - Aniruddha Shevle
抱歉 @AniruddhaShevle,我没有iOS设备,所以对此没有清晰的想法。 - Vicky Salunkhe
7
不是解决方案,如果是iOS呢? - Muhammad Faizan
发生在Windows上。 - Amine Da.
我在Android和Web上都遇到了这个问题(Windows和iOS上的Web是一样的)。 - undefined

17

除非Flutter开发团队解决此问题,否则没有解决方案。

即使连接物理iOS设备,在我的一台机器上(Mac OS Mojave)也会出现这个问题。当然,使用模拟的Android设备(无论哪种设备)也会出现这个问题。

我在另一台计算机(同样是MacOS Mojave)中也遇到了这个问题,该计算机配备一台物理的Android设备(具有非常旧的Android版本:5.1)。

flutter clean 在我的情况下完全不能解决它。


15

首先关闭您的WiFi/蓝牙。

然后运行以下命令:

flutter clean

然后退出或重新启动模拟器。


3
这对我没有效果:我成功地使用了一台实体的Android设备,但模拟器和实体的iOS设备都无法使用。而且开启调试模式的Android设备似乎可以在有或没有WiFi/蓝牙的情况下正常工作。 - nbloqs
@nbloqs 关闭 WiFi 只是确保您的开放连接将被关闭。 - Payam Khaninejad
谢谢,但我的意思是flutter clean根本无法解决这个问题,无论WiFi/蓝牙状态如何。它看起来确实像是一个永久性的问题,而不是与开放连接有关的问题。 - nbloqs
我在使用Visual Studio Code时遇到了这个问题,所以我关闭了Wifi,进入终端并执行了flutter clean,然后更改了模拟器设备,并重新开启了Wifi,问题得到了解决。 - ArifMustafa
谢谢,我使用了以下命令:flutter clean,然后是 flutter pub get,最后是 flutter run - Lucas De Lavra Pinto

6
这是我的问题,以下方法对我有效:

问题
应用程序会突然崩溃

原因
我正在使用cached_network_image,当用户上传大于2MB的重照片时,缓存耗尽内存,导致应用崩溃。没有警告。

解决方法
使用FadeInImage.memoryNetwork()或其他类似NetworkImage()的方法,而不是cache_network_image,它仅适用于小于2 MB 的照片。
谢谢 :)

1
我们可以使用以下代码:**placeholder: (context, url) => const CircularProgressIndicator()**,这样问题就可以通过 CachedNetworkImage 得到解决。 - Adie RT
1
@AdieRT 我一直在使用它,但仍然出现了这个问题。我建议每个人都使用这个简单的包,它不依赖于许多其他依赖项:https://pub.dev/packages/cached_network_image_builder你唯一需要实现的是当快照出现错误时,删除缓存文件,并在一定时间内(如10天)清理设备空间,以免造成混乱... - SwiftiSwift
1
@RayZion 谢谢你指出这个问题!我本来不会知道的... 我学到的是不要太依赖包... - SwiftiSwift

1
问题出在Flutter代码上。库socket_io_client似乎不接受builder。
OptionBuilder()
        .setTransports(['websocket'])
        .setPath('/messanging')
        // for Flutter or Dart VM

        //.setPath("/messanging")
       // .setExtraHeaders({"Authorization":"Bearer 
        ${datasource.user?.payload?.access_token}"}) // optional
        .build()

当我使用下面的map方法时,它起作用了。

socket = IO.io("http://10.18.5.212:3000/messanging", <String, dynamic>{
      "transports": ["websocket"],
      "Authorization":
          "Bearer eyJhbGciOiJIUzI1N......"
    }

1
在我的情况下(错误“HttpException:在接收完整标头之前关闭连接”),调用是针对使用Microsoft Internet Information Services作为后端的https地址进行的,在IIS网站的SSL设置中,我错误地设置了“客户端证书:接受”而不是“客户端证书:忽略”,将其设置为“忽略”解决了问题。

1

1

我通过将 request.persistentConnection = false;(默认为 true)来解决了这个问题。

写这篇文章是希望如果有人遇到同样的问题,可以参考一下。


你把这个设置在哪里了? - kishea
1
我扩展了IOClient并完成了以下操作:class PersistentIoClient extends http.IOClient { static final http.Client _client = PersistentIoClient( HttpClient()..connectionTimeout = const Duration(seconds: 15), ); static http.Client get client => _client; static sync.Lock lock = sync.Lock(reentrant: true); PersistentIoClient([HttpClient inner]) : super(inner); @override Future<http.IOStreamedResponse> send(http.BaseRequest request) async { request.persistentConnection = false; return await super.send(request); } } - Bosko Popovic
3
嗨,@BoskoPopovic,请将您的代码写在gist或github仓库中。我相信许多人都会需要它,包括我。谢谢。 - Dika
有人能告诉我更多关于这个的信息吗?@BoskoPopovic - Urvashi kharecha
非常感谢!这个解决了我的问题,三年后我还在使用Flutter 3.13.2。 我正在使用Dio,但设置是一样的: https://api.flutter.dev/flutter/dart-io/HttpClientRequest/persistentConnection.html使用Dio的代码:dio.get(path, options: Options(persistentConnection: false)) - undefined

0

在使用多部分发送图像的POST请求中,我遇到了相同的问题。通过以下方式解决:

contentType: MediaType('image', 'jpeg') in the http.MultipartFile 

函数

e.g

        request.files.add(
              http.MultipartFile(
                'image',
                stream,
                length,
                filename: basename(_image1.path),
                contentType: MediaType('image', 'jpeg'),
              ),
            );

'image'是参数名称。

不要忘记导入'package:http_parser/http_parser.dart';以获取MediaType。 您可以使用的其他MediaType包括

"image/png"
"image/jpg" 
"image/jpeg"

同时我也在Header中添加了"Content-Type": "multipart/form-data"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接