如何解决 SocketException: 主机查找失败: “ www.xyz.com”(操作系统错误: 没有与主机名相关联的地址,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)

This error happens for every method and every route I call through the app http package.

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

版本:

  http: ^0.12.0+1
flutter: 1.0

个案:

  1. 从家里,或者从我的手机: 虚拟设备

  2. 的每个部分都可以正常连接
  3. 来自我的工作网络(在防火墙后面) :

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

那个应用程序发出的呼叫有什么区别? Is there a way to route my app calls the same way as the ones in the webview?

Thanks!

147983 次浏览

Add <uses-permission android:name="android.permission.INTERNET" /> to your AndroidManifest.xml file.

添加 互联网许可不仅仅是一种解决方案。
您还必须确保您是在线的,无论是 < strong > 手机还是模拟器

  1. 无论是手机还是模拟器 < br > ,请确保您在线

  2. 请确保在应用程序的 android/app/src/main/AndroidManifest.xml 中授予了 Internet 权限

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

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

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

当设备试图访问任何互联网资源时,问题基本上就出现了 到 AndroidManifest.xml 文件@android/app/src 位置。

Check if the wifi is connected or not. Mine worked after restarting the wifi.

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

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

如果启用或勾选,则取消勾选。

  • 确保互联网是开着的(电话和电脑都是开着的)
  • 此外,请确保服务器正常工作
  • 正确检查你的网址

此外,最好查看模拟器的“扩展控件”中的“代理设置”。

对我来说,它的工作方式是更改为使用“无代理”设置。

enter image description here

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

当我在我的设备上启用 wifi 时,它工作得很好。

在我的例子中,计算机有互联网,但是模拟器没有。我在模拟器上配置了连接并解决了问题。

再确认一下

< use-mission android: name = “ android.permission on.INTERNET”/> 在您的应用程序的 android/app/src/main/AndroidManifest.xml 中

即使加上

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

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

网站的伺服器 IP 地址可能有一个错误,比如:

找不到服务器 IP 地址

最好等待一段时间,并确保重新启动 wifi,它为我工作。

Make sure your Emulator or your device connected to the internet. 如果您的仿真程序无法连接到互联网,请使用 VPN。

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

甚至我也有同样的问题。我重新启动了我的模拟器,它工作了! !

通过启用 WIFI,它为我工作,并确保你也添加了互联网权限的安卓清单自动添加,但你必须确保。如果仍然没有,那么使缓存失效并重新启动希望它工作

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

我的笔记本电脑通过手机的 mobile hotspot连接到互联网。 但显然模拟器无法访问互联网

后来,我切换到我的 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 或视觉工作室代码终端上运行 flutter run 命令

For me it was just bad url with function "Uri.https(...)" in Flutter. 用浏览器检查地址是否正确

我的问题是我使用的是 VPN。当模拟器连接到我计算机上的 VPN 时,它不能上网。也许能帮到别人。

对我来说,这是因为我的手机没有连接到互联网

只要启用网络连接

我故意断开我的模拟器 wifi,看看会发生什么(因为可能会有没有互联网可用的情况下)。这个错误引导我到了这里,但是,我所看到的都是变通方法,而不是错误处理。实际上,应用程序应该能够优雅地处理错误,而不会因为缺乏连接而崩溃。

到目前为止,我所做的就是捕捉错误,如果返回代码是 -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% 的时间都在使用它。我建议检查一下有没有可能阻断网络连接的东西。

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

你应该尝试以下方法:

Try run application in debug mode if its working fine and not working in release mode then it might be related to permission issue so add permissions(INTERNET, ACCESS_NETWORK_STATE) in manifest file.

  • 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" />

如果它没有在调试模式下工作,然后检查您的网址是正确的击中邮递员。如果它在邮递员工作,那么你应该这样执行你的网络服务:

在 pubspec.yaml 中添加依赖项:

dependencies:
flutter:
sdk: flutter


http: 0.13.3

在添加 http: 0.13.3之后,单击 Pub get 按钮如果它是用代码0执行的,那么这意味着它成功地添加到了您的项目中。

in your dart file import 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 2.2.1

Dart 版本

Dart 2.13.1

代码编辑器

1.58.0

在我的情况下,打开无线网络解决了这个问题。

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

在我的例子中,我在连接到 WIFI 到系统之前打开了模拟器。当网络(WIFI)已连接到我的系统,但无法连接到模拟器。 由于没有互联网接入的 < strong > 模拟器 ,这个问题发生。我解决这个问题通过这种方式。

解决方案 :

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

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

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

enter image description here

我的 Mac 上的 DNS 设置是无效的... 只是使用8.8.8.8没有任何内部 DNS 路由地址