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
案例:
在家里或通过网络共享 phone:
连接在虚拟设备的每个部分都正常工作
来自我的工作网络(在防火墙后面):
只有 Android Web 视图,我才能毫无问题地浏览互联网(我什至可以调用相同的 url,我在代码中使用它并且它有效)。
在虚拟设备中使用任何其他应用程序(Chrome、Google Play、ecc...)时出现连接错误,特别是在测试我的应用程序时 "SocketException"。
来自该应用的调用有何不同?
有没有办法以与 webview 中的相同的方式路由我的应用程序调用?
谢谢!
尝试将 <uses-permission android:name="android.permission.INTERNET" />
添加到您的 AndroidManifest.xml
文件。
添加互联网权限不仅仅是一个解决方案。
您还必须确保您在线,无论是 移动设备还是模拟器
Make sure you are online whether it is mobile or emulator
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" />
每当我在大约 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
案例:
在家里或通过网络共享 phone: 连接在虚拟设备的每个部分都正常工作
来自我的工作网络(在防火墙后面):
只有 Android Web 视图,我才能毫无问题地浏览互联网(我什至可以调用相同的 url,我在代码中使用它并且它有效)。 在虚拟设备中使用任何其他应用程序(Chrome、Google Play、ecc...)时出现连接错误,特别是在测试我的应用程序时 "SocketException"。
来自该应用的调用有何不同? 有没有办法以与 webview 中的相同的方式路由我的应用程序调用?
谢谢!
尝试将 <uses-permission android:name="android.permission.INTERNET" />
添加到您的 AndroidManifest.xml
文件。
添加互联网权限不仅仅是一个解决方案。
您还必须确保您在线,无论是 移动设备还是模拟器
Make sure you are online whether it is mobile or emulator
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" />