如何在InternetAddress.lookup中添加多个主机实现多域名查询?
同时监听多个主机地址的网络连通性实现方案
你的代码错误在于InternetAddress.lookup()方法仅支持传入单个主机地址,不能用&&拼接两个域名,这既不符合语法规则,也无法实现同时查询多个主机的需求。以下是两种常见场景的正确实现方式:
场景1:任意一个主机连通即判定网络正常
如果只要google.com或bing.com其中一个能解析成功,就认为网络可用,可以用Future.any实现,它会返回第一个成功完成的异步任务结果:
try { // 同时发起两个主机的解析请求 final googleLookup = InternetAddress.lookup('google.com'); final bingLookup = InternetAddress.lookup('bing.com'); // 等待任意一个请求成功 final result = await Future.any([googleLookup, bingLookup]); if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) { isConnected = true; } } catch (e) { // 两个主机都解析失败时,标记为无网络 isConnected = false; }
场景2:所有主机都连通才判定网络正常
如果要求google.com和bing.com都能解析成功才认为网络可用,使用Future.wait等待所有异步任务完成,再逐一验证结果:
try { // 同时发起两个解析请求,等待全部完成 final List<List<InternetAddress>> allResults = await Future.wait([ InternetAddress.lookup('google.com'), InternetAddress.lookup('bing.com'), ]); // 分别验证两个主机的解析结果 final googleValid = allResults[0].isNotEmpty && allResults[0][0].rawAddress.isNotEmpty; final bingValid = allResults[1].isNotEmpty && allResults[1][0].rawAddress.isNotEmpty; // 只有两个都有效才标记为网络正常 isConnected = googleValid && bingValid; } catch (e) { // 任意一个主机解析失败,标记为无网络 isConnected = false; }
更灵活的封装方式
可以把单个主机的连通性检查封装成独立函数,方便复用和扩展更多主机:
// 封装单个主机的连通性检查逻辑 Future<bool> isHostReachable(String host) async { try { final result = await InternetAddress.lookup(host); return result.isNotEmpty && result[0].rawAddress.isNotEmpty; } catch (_) { return false; } } // 使用示例 void checkNetwork() async { // 同时检查多个主机 final results = await Future.wait([ isHostReachable('google.com'), isHostReachable('bing.com'), ]); // 逻辑或:任意一个主机可达即认为网络正常 isConnected = results.any((isReachable) => isReachable); // 若需要逻辑与:所有主机都可达才认为网络正常,替换为下面一行 // isConnected = results.every((isReachable) => isReachable); }
内容的提问来源于stack exchange,提问作者twelvell
相关产品推荐
相关产品推荐

