如何解决SocketException:主机查找失败:'www.xyz.com'(操作系统错误:没有与主机名关联的地址,errno = 7)

Dav*_*vid 9 android http socketexception dart flutter

每当我尝试在大约20秒后执行http呼叫时,都会在控制台中出现以下错误:

E/flutter ( 8274): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter ( 8274): SocketException: Failed host lookup: 'flutter-project-xxxxx.firebaseio.com' (OS Error: No address associated with hostname, errno = 7)
Run Code Online (Sandbox Code Playgroud)

我通过应用程序http包调用的每种方法和每种路由都会发生此错误。

我正在使用Android Studio中的AVD虚拟设备在Windows上开发Flutter应用程序。

版本:http:^ 0.12.0 + 1抖动:1.0

情况:

  1. 在家中或通过手机进行网络共享:在虚拟设备的每个部分都可以正常连接

  2. 从我的工作网络(在防火墙之后):

只有使用Android Web View,我才能毫无问题地浏览互联网(我什至可以调用代码中使用的相同URL,它也可以工作)。在测试我的应用程序时,在虚拟设备中使用任何其他应用程序(Chrome,Google Play,ecc ...),特别是“ SocketException”时,出现连接错误。

该应用发出的呼叫之间有什么区别?有没有一种方法可以路由我的应用程序调用,就像在网络视图中一样?

谢谢!

Ume*_*qas 41

确保您已经添加了android/app/src/main/AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 感谢分享图像,帮助我把它放在哪里 (4认同)

小智 18

尝试添加<uses-permission android:name="android.permission.INTERNET" />到您的AndroidManifest.xml文件中。

  • 这项工作是否有效,我遇到了同样的问题,http 调用了开发工作但生产失败。 (2认同)

Nai*_*lah 16

您应该尝试以下操作:

尝试在调试模式下运行应用程序,如果它工作正常并且在发布模式下无法工作,那么它可能与权限问题有关,因此在清单文件中添加权限(INTERNET,ACCESS_NETWORK_STATE)。

  • your_project_root_directory/android/app/src/debug/AndroidManifest.xml
  • your_project_root_directory/android/app/src/main/AndroidManifest.xml
  • your_project_root_directory/android/app/src/profile/AndroidManifest.xml

如果不包含则添加权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

如果它在调试模式下不起作用,请通过点击邮递员来检查您的网址是否正确。如果它在邮递员中工作,那么你应该以这种方式执行你的网络服务:

在 pubspec.yaml 中添加依赖项:

dependencies:
  flutter:
    sdk: flutter

  http: 0.13.3
Run Code Online (Sandbox Code Playgroud)

添加 http:0.13.3 后,单击 Pub get 按钮,如果执行代码为 0,则表示已成功添加到您的项目中。

在你的 dart 文件中导入 http.dart:

import 'package:http/http.dart';
Run Code Online (Sandbox Code Playgroud)

现在编写以下代码来执行Web服务:

var url = Uri.parse('some-url-login?username=abc&&password=xyz');
var response = await get(url, headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Headers': 'Content-Type',
          'Access-Control-Allow-Methods':
          'GET,PUT,POST,DELETE'
        });
if (response.statusCode == 200) {
 // success
} else if(response.statusCode == 404){
 // not found
} else if(response.statusCode == 500){
 // server not responding.
} else {
 // some other error or might be CORS policy error. you can add your url in CORS policy. 
}
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助你。寒意!


小智 13

我添加<uses-permission android:name="android.permission.INTERNET" />到我的清单。然后我不得不重新启动模拟器才能让互联网工作。


小智 13

转到 AVD 管理器,然后选择您的模拟器,在操作菜单上单击向下选项符号,然后选择擦除数据,然后重新启动模拟器。这个对我有用。

  • 只有这个答案对我有用,非常好,干杯 (3认同)
  • 首先,我升级了 flutter 并清除了 AVD 管理器中的模拟器数据。有效。 (3认同)

Ish*_*dra 10

添加互联网许可不仅是解决方案。
您还必须确保您在线,无论是移动设备还是模拟器

  1. 确保您在线,无论它是移动设备还是仿真器

  2. 确保您已在应用的android / app / src / main / AndroidManifest.xml中授予互联网许可

    <uses-permission android:name="android.permission.INTERNET"/>

  • 奇怪的是,这在调试模式下无需互联网许可即可工作 (18认同)
  • 如果应用程序需要访问网络状态,即允许应用程序访问有关网络的信息,则还需要以下权限。&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt; 有关更多信息,请参阅:https://developer.android.com/training/basics/network-ops/connecting (6认同)
  • AndroidManifest.xml有多个,需要区分它们。/debug/AndroidManifest.xml 用于调试应用程序(开发中), /main/AndroidManifest.xml 用于生产中的应用程序 (APK) 。您需要授予这两个文件的访问权限。 (3认同)
  • @Sisir 当应用程序编译时,它会合并所有 Android 清单(来自所有插件和主清单)。因此,即使您没有添加某些权限,如果插件清单具有该权限,它最终也会出现在编译的清单中。 (2认同)

Joe*_*uza 8

即使我也有同样的问题。我重新启动了模拟器,它成功了!

  • 请仔细检查您的措辞“即使我......”。对于具有不同语言背景的读者来说,读起来很奇怪,并且可能会被误读(诚然需要一些努力)作为不尊重的东西。 (2认同)

Rah*_*aha 8

就我而言,我在将 WIFI 连接到系统之前打开了模拟器。当网络(WIFI)已连接到我的系统但无法连接到模拟器时。由于模拟器无法访问互联网,因此出现此问题。我通过这种方式解决了此问题。

解决方案

连接网络访问系统然后我关闭模拟器并重新打开它。安装应用程序,运行应用程序并打开它。最后,每个 API 都能正常工作。


Sam*_*h.K 7

如果您使用的是模拟器,请确保移动数据处于活动状态

  • 这对我有用。我不得不关闭无线网络并仅依靠数据。我已经有了 &lt;uses-permission android:name="android.permission.INTERNET" /&gt; 。 (3认同)
  • 这也发生在我身上。如果添加 INTERNET 权限对任何人都不起作用,请尝试关闭并重新启动模拟器,也可以这样做 (2认同)

Bal*_*des 6

如果您在使用插件时遇到此错误,请不要忘记在尝试订阅之前flutter_socket_io初始化套接字。socketIO.init(); socketIO.connect();当我忽略它时,我收到了与上面指出的相同的错误。


M E*_*B O 6

就我而言,这是因为我的手机未连接到互联网

只需启用互联网连接


小智 5

确保您的移动设备或模拟器已连接到互联网


Ahs*_*han 5

通过启用 WIFI,它对我有用,并确保您还在 android 清单中添加了互联网权限,它也会自动添加,但您必须确保。如果仍然不行,则使缓存无效并重新启动,希望它能正常工作