当今没有开发不需要连接到网络的应用程序,因此准确控制当前网络状态尤为重要。通常有以下几种情况:获取移动电话的当前网络类型,是否连接到Wi-Fi以及是否可以访问外部网络(Internet)。今天我们将讨论如何判断手机是否可以与服务器通信。注意:本文中的所有代码都是基于Kotlin语言实现的。 1.错误的方法在编写代码之前,我在Internet上搜索了主流解决方案,发现每个人在上一篇文章中都有相同的想法:是否在NetworkInfo中使用状态(状态)由连接状态来判断,但是结果是残酷的。此方法用于判断Wi-Fi是否已连接,并不意味着手机已连接到Internet。但是,我还发布了代码供您参考:2.正确的方法许可权:& lt; uses-permissionandroid:name =& quot; android.permission.INTERNET& quot; /& lt; uses -permissionandroid:name =& quot; android.permission .ACCESS_NETWORK_STATE" />解决方案1:通过ping命令的返回结果来ping服务器地址(简单),以了解是否连接到外部网络,目前主流有效的方法都是基于此原理,但其中大多数都是ping百度地址,在这里建议使用8.8.8.8。示例代码如下:PS:8.8.8.8是dns服务器地址,它是Google提供的免费DNS服务器的IP地址。该解决方案的优点是:它可以在主线程上运行,并且同步速度很快。缺点:它不适用于某些旧手机,例如Galaxy S3。原因与手机的OEM有关。出于特定原因,请参阅:为什么ping只能在某些设备上工作而不能在其他设备上工作?解决方案2:连接到服务器端口(推荐)使用套接字连接到服务器的端口,然后使用连接结果确定电话是否已连接到Internet。建议使用此方法,因为它适用于所有Android版本的手机,示例代码如下:funisOnline()= try {valTImeoutMs = 1500Socket()。use {//连接端口不同,并且网络协议是不同的。 DNS:53; HTTP:80valsocketAddr = InetSocketAddress(& quot; 8.8.8.8& quot;,53)it.connect(socketAddr,TImeoutMs)} true} catch(e:Throwable){false}优点:快速,非常快的方法占用了所有资源,没有烦人的版本适配缺点:无法在主线程中运行。解决方案3:根据域名获取IP(推荐)使用InetAddress提供的getByName()方法获取域名的IP地址,然后判断是否成功连接到外部网络。建议使用此方法。优点:速度快,可以自定义超时,可以在主线程上运行,所有版本都具有所有缺点:否3.总结实际上,以上三种有效方案都是相同的:进行网络访问(必须访问其中之一)公共网络)地址(无论是域名还是IP地址)根据网络返回的结果进行实际判断