Приложение Flutter не может подключиться к серверу фляги, как получилось? - PullRequest
0 голосов
/ 05 октября 2019

Я написал простое приложение-флаттер, и когда пользователь нажимает кнопку, он запускает 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, но продолжаю получать:

необработанное исключение: SocketException: ошибка ОС: истекло время ожидания соединения, errno = 110, адрес = 192.168.1.10, порт = 38466

Кстати, я отслеживал входящий трафик на моемкомпьютер для проверки входящих HTTP-пакетов получения (сервер колб работает на моем компьютере), но эти http-пакеты GET так и не нашли пути к моему компьютеру.

Еще две вещи, на которые следует обратить внимание:

  • Если я оберну функцию getData () с помощью простого приложения-флаттера и запусту ее на ПК , на котором работает сервер фляги, я получу ожидаемый ответ!

  • Брандмауэр всегда был неактивен (состояние UFW неактивно)

1 Ответ

1 голос
/ 05 октября 2019

Простая проблема.

Вы пытаетесь использовать GET запрос, используя ваш IP, который не будет работать.

Я вижу, что вы используете сервер Flask на локальном хостек которому можно получить прямой доступ с вашего компьютера, но не снаружи. Таким образом, вы получаете тайм-аут с вашим приложением.

Решение

Вам необходимо предоставить свой локальный хост, чтобы можно было использовать внешнее соединение.

Предложения:

  1. ngrok или
  2. serveo.net

В основном они разрешают внешний трафик на ваш локальный порт

Myтестирование.

Запуск сервера node с использованием express js на порту 3000 на моем конце.

Но http://<my_ip>: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 для подключения извне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...