gpt4 book ai didi

android - 定期检查以太网连接android

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:39 24 4
gpt4 key购买 nike

我正在尝试定期检查网络连接。但是,这是针对中国 Android Mini PC,而不是平板电脑或智能手机。我使用的是 以太网转 USB 适配器,而不是 Wi-Fi。首先我使用了一个 broadcastreceiver 类:

public class NetworkStateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getExtras() != null) {
@SuppressWarnings("deprecation")
NetworkInfo eni = (NetworkInfo) intent.getExtras().get(
ConnectivityManager.EXTRA_NETWORK_INFO);

if (eni != null && eni.getState() == NetworkInfo.State.CONNECTED) {
Log.d(TAG, "Network " + eni.getTypeName() + " connected.");
}
}
if (intent.getExtras().getBoolean(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Log.d(TAG, "There's no network connectivity.");
}
}
}

这非常适合 Wi-Fi 和移动设备。但是,对于以太网,存在复杂性。当我连接以太网到 USB 适配器时,它认为它已经有以太网连接,无论以太网电缆是否连接。只有在移除适配器时,它才知道以​​太网连接已被移除。

我试过使用套接字,效果不错:

    private static boolean checkSocket(String host, int port) {
Socket socket = null;
boolean reachable = false;
try {
socket = new Socket(InetAddress.getByName(host), port);
reachable = true;
} catch (UnknownHostException e) {
} catch (IOException e) {
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
}
}
}
return reachable;
}

当有连接时,它可以完美快速地工作。当连接丢失时,程序需要很长时间才能知道它已经丢失。我需要这个解决方案,但它应该更快地知道以太网连接已丢失。此外,这依赖于异常,我一点也不喜欢。

最后我尝试了一个简单的 ICMP 消息:

    try {
InetAddress address = InetAddress.getByName(host);
if (address.isReachable(timeout)) {
return true;
}
} catch (UnknownHostException e) {
} catch (IOException e) {
}
return false;

应该有效,对吧?不幸的是,事实并非如此。直到现在,我在执行这段代码时总是收到一个 false

我做错了什么,正确的做法是什么?

编辑 1

我现在已经尝试过这个解决方案,它可以工作,也可以不工作。这既有趣又烦人,因为我正在 onResume() 中检查它。经过几次正确的尝试后,它突然停止了。我不知道为什么。

    boolean reachable = false;
try {
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 " + host);
int retValue = p1.waitFor();
reachable = (retValue == 0);
Log.d(TAG, String.valueOf(reachable));
p1.destroy();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return reachable;

最佳答案

尝试连接到 ip 地址,而不是像您那样解析 dns

添加:尝试使用 ConnectivityManager.getActiveNetworkInfo然后

((ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo().isConnected()

关于android - 定期检查以太网连接android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com