How to solve SocketException: Failed host lookup: 'www.xyz.com' (OS Error: No address associated with hostname, errno = 7)

How to solve SocketException: Failed host lookup: 'www.xyz.com' (OS Error: No address associated with hostname, errno = 7)

每当我在大约 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)

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

我正在 Windows 上使用来自 Android Studio 的 AVD 虚拟设备开发一个 flutter 应用程序。

版本:

  http: ^0.12.0+1
  flutter: 1.0

案例:

  1. 在家里或通过网络共享 phone: 连接在虚拟设备的每个部分都正常工作

  2. 来自我的工作网络(在防火墙后面):

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

来自该应用的调用有何不同? 有没有办法以与 webview 中的相同的方式路由我的应用程序调用?

谢谢!

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

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

  1. Make sure you are online whether it is mobile or emulator

  2. Make sure you have given internet permission in your app's android/app/src/main/AndroidManifest.xml

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

我添加了 <uses-permission android:name="android.permission.INTERNET" /> 我的清单。然后我必须重新启动模拟器才能上网。

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

问题基本上是在设备尝试访问任何互联网资源时出现的,要修复添加 到 AndroidManifest.xml 文件@android/app/src 位置。

检查wifi是否连接。重启wifi后我的就可以了。

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

检查您是否在 gradle 设置中启用了离线工作。 文件-> 设置-> 构建-> 构建工具-> 离线工作

如果启用或选中,则取消选中它。

  • 确保互联网已开启(在 phone 和 PC 上)
  • 另外,确保服务器正常工作
  • 正确检查您的 URL

另外,最好看看模拟器 'Extended controls' 里面的 'Proxy settings'。

它对我有用的方式是更改为使用 'No Proxy' 设置。

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

当我在我的设备上启用 wifi 时,它工作正常。

翻译:在我的例子中,电脑有互联网,但模拟器没有。我在模拟器上配置了连接,解决了。

仔细检查/确保你有

<uses-permission android:name="android.permission.INTERNET" /> 在您应用的 android/app/src/main/AndroidManifest.xml

即使添加

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

在您的 android/app/src/main/AndroidManifest.xml 中,如果您仍然发现问题,那么

网站的服务器 IP 地址可能有错误,例如:

Server IP address could not be found

最好等一段时间,确保重启wifi,对我有用。

确保您的模拟器或您的设备已连接到互联网。 如果您的模拟器无法连接到互联网,请使用 VPN。

有时,其他 wifi 可能会干扰您连接的 wifi,这也会导致此错误。尝试将连接的 wifi 频道设置为自动或远离其他 wifi 频道。

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

通过启用 WIFI 它对我有用,并确保你还在 android 清单中添加了互联网权限,它也会自动添加,但你必须确保。如果还是不行,那么使缓存无效并重新启动希望它有效

我在 模拟器 上 运行 应用时遇到了同样的问题。

我的笔记本电脑通过 phone 的 移动热点 连接到互联网。 但显然模拟器无法访问互联网

后来,我切换到我的Wi-Fi路由器连接,申请顺利进行。

我不确定,但是否有任何特殊访问权限可以授予?

提示:尝试在模拟器上使用谷歌搜索来检查互联网连接

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

如果你使用 vscode 你会得到 gai_error=0 那是如果 http 连接成功

这里是放置互联网权限的正确位置,因为要知道位置非常具有挑战性

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.appName">
<uses-permission android:name="android.permission.INTERNET" />

运行 cmd 或 visual studio 代码终端上的 flutter 运行 命令

对我来说,Flutter 中的函数“Uri.https(...)”很糟糕 url。 用浏览器检查地址是否正确

我的问题是我使用的是 VPN。当连接到我计算机上的 VPN 时,模拟器无法访问互联网。它可能会对某人有所帮助。

我的情况是因为我的 phone 没有连接到互联网

只需启用互联网连接

我故意断开了我的模拟器 wifi 以查看会发生什么(因为在某些情况下可能没有互联网可用)。该错误将我带到这里,但是,我所看到的只是解决方法,而不是错误处理。真的,应用程序应该能够优雅地处理错误,而不是因为缺少连接而崩溃。

到目前为止,我所做的只是捕获错误,如果 return 代码为 -1(或 200 以外的任何值),我知道我遇到了问题并且可以让应用响应适当地。

var request = new http.MultipartRequest("POST", uri);

// multipart that takes file
var multipartFile = new http.MultipartFile('file', stream, length,
    filename: fileToUpload.path);

// add file to multipart
request.files.add(multipartFile);

// send
try {
  var response = await request.send();
  print(response.statusCode);

  // listen for response
  response.stream.transform(utf8.decoder).listen((value) {
    print(value);
  });

  return response.statusCode;
}
catch (e)
{
  return -1;
}

正如其他人所说,这绝对是互联网问题。 @petro 和@Tushar Nikam 的回应让我朝着正确的方向前进。我的模拟器处于飞行模式,但我不知道如何;我 90% 的时间都在使用它。我建议检查是否有任何可能阻止互联网连接的东西。

检查您的 url 地址,在我的情况下,我使用了错误的 url。

您应该尝试以下操作:

在调试模式下尝试 运行 应用程序,如果它在发布模式下工作正常并且在发布模式下不工作,那么它可能与权限问题有关,因此在清单文件中添加权限(互联网,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" />

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

在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter

  http: 0.13.3

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

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

import 'package:http/http.dart';

现在编写这段代码来执行webservice:

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. 
}

希望对您有所帮助。冷静!

我正在使用 arch Linux。

Linux arch 5.14.7-arch1-1

和 Flutter 版本

Flutter 2.2.1 

Dart 版本

Dart 2.13.1

代码编辑器

1.58.0

就我而言,打开 wifi 解决了问题。

对我来说,问题是我的模拟器禁用了网络连接(LTE 和 Wi-Fi)。

在我的例子中,我在连接到 WIFI 之前打开了模拟器 system.When 网络(WIFI)已连接到我的系统但无法连接到模拟器。 由于无法访问 Emulator,这个问题 occurs.I 通过这种方式解决了这个问题。

解决方案:

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

确保您已在 android/app/src/main/AndroidManifest.xml

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