对127.0.0.1:80的HTTP请求失败

时间:2018-07-22 16:38:31

标签: dart flutter

环境

  • Android Studio最新版本
  • 运行Android Nougat的Android模拟器
  • MAMP用作HTTP服务器

问题

我的简单方法

  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'

问题

  1. 为什么Android模拟器/ Flutter / Dart处理的127.0.0.1与 有效的FQDN?

  2. 以及如何更改此行为?

2 个答案:

答案 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