环境
问题
我的简单方法
Future<String> _getSimpleReply( String command, callback, errorCallback ) async {
try {
HttpClientRequest request = await _myClient.get( '127.0.0.1', 80 '/' );
HttpClientResponse response = await request.close();
await callback( response.toString() );
} on SocketException catch( e ) {
errorCallback( e.toString() );
}
}
失败,并显示错误:
cbLoginFailed :: SocketException: OS Error:
Connection refused, errno = 111, address = 127.0.0.1, port = 46414
当前使用已配置为可访问互联网的Android模拟器:
<uses-permission android:name="android.permission.INTERNET"/>
出于测试目的,HTTP服务器是MAMP,如果我在浏览器中输入以下链接,它将执行index.php脚本并返回一些简单的字符串:
http://127.0.0.1/index.php
如果我将127.0.0.1替换为本地主机,情况不会改变。
但是,如果我确实使用有效的公共FQDN 更改了127.0.0.1,则该方法可以正常工作:
doLoginSuccess :: Instance of '_HttpClientResponse'
问题
为什么Android模拟器/ Flutter / Dart处理的127.0.0.1与 有效的FQDN?
以及如何更改此行为?
答案 0 :(得分:2)
您正在尝试访问本地主机,它是您的电话/仿真器,而不是您假设运行测试服务器的PC。 您需要在PC和手机之间建立网络,并改用本地IP地址
答案 1 :(得分:0)
第一条评论指出,localhost或127.0.0.1是-在Android模拟器上运行应用程序时-实际上是要在其上运行Android应用程序的本地计算机。就Android应用而言,本地计算机是模拟的Android系统。
因此,颤动代码中的http请求根本不会离开模拟器。由于Flutter应用程序不提供HTTP服务器,因此模拟器拒绝了http请求。
需要更改为正在执行模拟器的主机的地址。
Android仿真器使用特殊的IP地址与其主机或主机网关进行通信。
在Android documentation中看一下。
例如,主机的环回接口由以下IP标识: 10.0.2.2