【问题标题】:Flutter app fails to connect to a flask server, how come?Flutter 应用无法连接到烧瓶服务器,怎么回事?
【发布时间】:2020-02-03 05:33:42
【问题描述】:

我写了一个简单的颤振应用, 当用户按下按钮时,它会向我的烧瓶服务器发起一个 http GET。这是相关的颤振代码:

Future <String> getData() async {
  http.Response resp =
      await http.get('http://192.168.1.10:5000/search?search=Hooray', headers: {
    HttpHeaders.contentTypeHeader: "application/json",
  });

  if (resp.statusCode == 200) {
    String data = resp.body;
    var decodedData = jsonDecode(data);
    print(decodedData);
    return decodedData;
  } else {
    int stCode = resp.statusCode;
    print('statusCode = $stCode');
    print(resp.reasonPhrase);
    return (resp.reasonPhrase);
  }
}

void performTasks() async {
  String res = await getData();
  print(res);
}

我的烧瓶服务器在我的 Linux 机器上运行:

def main():
   app.run(host='0.0.0.0', debug=True)

我在我的 Android 设备上运行了 Flutter 应用程序,但我不断收到:

未处理的异常:SocketException:操作系统错误:连接超时, errno = 110,地址 = 192.168.1.10,端口 = 38466

顺便说一句,我已经监控了我电脑上的入站流量以检查传入的 http get 数据包(flask 服务器在我的电脑上运行),但是这些 http GET 数据包从未找到我的电脑。

还有两点需要注意:

  • 如果我用一个简单的颤振应用程序包装 getData() 函数并在运行烧瓶服务器的 pc 上运行它,我会得到预期的响应!

    李>
  • 防火墙始终处于非活动状态(ufw 状态为非活动状态)

【问题讨论】:

    标签: android flask flutter


    【解决方案1】:

    简单的问题。

    您正在尝试使用您的 IP 使用 GET 请求,这将不起作用。

    我看到您在本地主机上运行Flask 服务器,可以从您的电脑直接访问,但不能从外部访问。因此,您的应用程序会超时。

    解决方案

    您需要公开您的本地主机,以便可以使用外部连接。

    建议:

    1. ngrok 或
    2. serveo.net

    基本上它们允许外部流量到您的本地主机端口

    我的测试。

    在我的端口3000 上使用express js 运行node 服务器。

    但是http://&lt;my_ip&gt;:3000/ 不能在外面工作

    所以我在一个单独的终端上运行了命令ssh -R test_user:80:localhost:3000 serveo.net,它只是说我想公开我的端口3000,外部连接将连接到https://test_user.serveo.net(它会在运行外部连接命令后给出URL )。

    现在我的节点服务器可以看到来自我的localhost(来自我的电脑)的连接以及是否有人访问https://test_user.serveo.net

    对于颤振应用

    Future <String> getData() async {
      http.Response resp =
          await http.get('https://test_user.serveo.net', headers: {
        HttpHeaders.contentTypeHeader: "application/json",
      });
      print(resp.body);
     //... whatever
    }
    

    将向您显示响应。

    编辑:

    我发现的另一个快速技巧是这个

    在你的机器上输入ifconfig | grep inet,它会给你类似的东西

     inet 192.168.12.1  netmask 255.255.255.0
    

    您也可以使用http://192.168.12.1从外部连接

    【讨论】:

    • 嗨,医生,但我在我的 NAT 中运行所有东西,所以我想不需要 ngrok。我不小心发现我智能手机上的 wifi 被关闭了(Big Oooops),真是个愚蠢的错误!午夜后编码有它的后果;)哦,男孩!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2022-01-25
    相关资源
    最近更新 更多