"flutter(os error:no address associated with hostname,errno = 7)"仅适用于安卓平台。

7
我在 esp32 wifi 模块(arduino 框架)上创建了一个 DNS 服务器,用于与 flutter 应用程序通信。它可以在 dart 和 flutter ios 应用程序中正确工作,但不能在 flutter android 应用程序中正常工作。在 flutter android 中出现以下错误:“flutter (os error: no address associated with hostname, errno = 7)”。由于它在 dart 和 ios flutter 应用程序中完美运行,因此我希望不是 esp32 wifi 程序的错误。我认为这是 flutter android 的问题。我尝试了 "https://github.com/flutter/flutter/issues/27883" 中发布的方法,在我的情况下也无法解决。因此,请帮助我解决这个问题。

https://github.com/flutter/flutter/issues/27883

ESP32 代码


#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiClient.h>

WiFiServer wifiServer(80);

String hostname="esp32";

const char* ssid = "ssid";
const char* password =  "password";

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_AP);
  WiFi.begin(ssid, password);
  WiFi.setHostname("toyama");
  Serial.printf("Connecting to ssid '%s'", ssid);
  Serial.println();
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi connected to '%s'", WiFi.SSID().c_str());
  Serial.println();
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (!MDNS.begin(hostname.c_str())) {
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.printf("mDNS responder started at %s.local:80\n",hostname.c_str());

  // Start TCP (HTTP) server
  wifiServer.begin();

  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);
  Serial.print("Server started at ");
  Serial.print(WiFi.localIP());
  Serial.println(":80");

}

void loop()
{
  WiFiClient client = wifiServer.available();

  if (client) {
    Serial.println("Client connected");
    while (client.connected()) {

      if (client.available() > 0) {
        String c = client.readString();
        Serial.print(client.remoteIP().toString());
        Serial.print(":");
        Serial.print(c);
      }

      if (Serial.available() > 0)
      {
        String ch = Serial.readString();
        client.println(ch);
        Serial.print(WiFi.localIP());
        Serial.print(":");
        Serial.println(ch);
      }
    }

    client.stop();
    Serial.println("Client disconnected");

  }
}

Flutter 代码


import 'package:flutter/foundation.dart';
import 'dart:io';
import 'package:flutter/material.dart';

void main() async {
  // modify with your true address/port
  Socket sock = await Socket.connect("esp32.local", 80);
  runApp(MyApp(sock));
}

class MyApp extends StatelessWidget {
  Socket socket;

  MyApp(Socket s) {
    this.socket = s;
  }

  @override
  Widget build(BuildContext context) {
    final title = 'TcpSocket Demo';
    return MaterialApp(
      title: title,
      home: MyHomePage(
        title: title,
        channel: socket,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;
  final Socket channel;

  MyHomePage({Key key, @required this.title, @required this.channel})
      : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Form(
              child: TextFormField(
                controller: _controller,
                decoration: InputDecoration(labelText: 'Send a message'),
              ),
            ),
            StreamBuilder(
              stream: widget.channel,
              builder: (context, snapshot) {
                return Padding(
                  padding: const EdgeInsets.symmetric(vertical: 24.0),
                  child: Text(snapshot.hasData
                      ? '${String.fromCharCodes(snapshot.data)}'
                      : ''),
                );
              },
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _sendMessage,
        tooltip: 'Send message',
        child: Icon(Icons.send),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  void _sendMessage() {
    if (_controller.text.isNotEmpty) {
      widget.channel.writeln(_controller.text);
    }
    // widget.channel.write('\n');
  }

  @override
  void dispose() {
    widget.channel.close();
    super.dispose();
  }
}
4个回答

10
将添加到您的Manifest.xml文件中。在AVD管理器中选择设备并通过选项(向下箭头按钮)清除数据。重新启动您的模拟器。重新运行应用程序。

从来没想过这可能与AVD有关。尽管错误信息似乎与此无关。上述解决方案对我有效。感到惊讶! - nesimtunc

4
如果你在你的 Manifest.xml 文件中添加了 <uses-permission android:name="android.permission.INTERNET"/>,但仍然出现此错误,那么请确保当你在运行 AVD 时使用的笔记本电脑网络速度较慢时会出现此错误。

1

我也遇到了同样的问题。按照以下步骤操作: 在Android Studio中,进入AVD管理器,然后从操作选项卡中,点击擦除数据图片


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

对我来说,问题可能来自 VPN。

我还在模拟器上禁用了 Wi-Fi,然后重新启用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接