【问题标题】:How to check continously that a IP is reachable?如何持续检查 IP 是否可达?
【发布时间】:2014-03-20 06:23:47
【问题描述】:

我正在编写一个用于同步目的的应用程序。基本上它应该在可访问时将数据传输到 nas 或共享文件夹。例如:当我回家时,我的手机注意到 192.168.1.1 现在可以访问并开始同步过程。如何做到这一点?我需要一些东西来不断检查目的地是否可达。

有什么想法吗?

【问题讨论】:

  • 你会在任何特定时间或任何时间回家吗?

标签: java android networking


【解决方案1】:

拥有一个后台服务,并让它每隔 5 分钟左右检查一次 IP 是否可达。如果是,请启动同步过程。

【讨论】:

  • 每 5 分钟可能会很快干电池。
  • 并非如此,如果您只是醒来并进行一些处理,则不会。与显示器和收音机相比,CPU 几乎不使用电池。要测试 - 拿一部手机,给它充电。将其置于飞行模式,但编写一个采用 CPU 唤醒锁的应用程序并将其保持打开状态。几天后它仍然有汁液。现在,如果你打开屏幕,你很快就会死掉。
  • 如果您想检测网络状态何时发生变化,您可以使用意图吗? developer.android.com/reference/android/net/wifi/…
【解决方案2】:

我的想法如下:

【讨论】:

    【解决方案3】:

    以下是可以做到的服务。为了更容易理解,它使用 CountDownTimer 来处理匿名线程的循环,以使网络操作远离主线程。理想情况下,这些可能应该组合在一个处理程序中。此外,除非对 'sycing' 保护条件应用更好的同步方法,否则 TIME_OUT_MSECS 与 CHECK_FREQ_MSECS 相比应保持相当小,以避免检查与设置时的竞争条件。

    package com.example.test;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.CountDownTimer;
    import android.os.IBinder;
    import android.util.Log;
    
    public class NetCheckService extends Service {
    
        private final static String TAG = "NetCheckService";
    
        private final static long CHECK_FREQ_MSECS = 300000L;  // 5 minutes 
        private final static int  TIME_OUT_MSECS = 5000;       // 5 seconds    
        private final static String IP_ADDR = "192.168.0.1";
    
        private Boolean syncing = false;
        CountDownTimer cdt = null;
    
        @Override
        public void onCreate() {       
            super.onCreate();
    
            Log.i(TAG, "Starting network check...");
    
            cdt = new CountDownTimer(Long.MAX_VALUE, CHECK_FREQ_MSECS) {
                @Override
                public void onTick(long millisUntilFinished) {
    
                    // Don't check if we're already syncing.
                    if (syncing)
                        return;
    
                    Log.i(TAG, "Checking to see if IP address " + IP_ADDR + " is reachable...");
                    new Thread(new Runnable() {
    
                        @Override
                        public void run() {
                            try {
                                if (InetAddress.getByName(IP_ADDR).isReachable(TIME_OUT_MSECS))
                                    doSync();
                                else
                                    Log.i(TAG, "IP address is not reachable.");
                            } catch (UnknownHostException e) {
                                // Network wasn't reachable; ignore
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }
    
                @Override
                public void onFinish() {
                    Log.i(TAG, "Nearly 300 million years have elapsed; this timer is tired.");
                }
            };
    
            cdt.start();
        }
    
        @Override
        public void onDestroy() {
    
            cdt.cancel();
            Log.i(TAG, "Timer cancelled.");
            super.onDestroy();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {       
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public IBinder onBind(Intent arg0) {       
            return null;
        }
    
        private void doSync() {
            syncing = true;
            Log.i(TAG, "Synching ...");
            // Do synchronization stuff
            syncing = false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 2011-11-30
      • 2015-09-12
      • 2017-05-31
      • 2014-05-19
      • 2020-05-03
      • 2023-04-09
      相关资源
      最近更新 更多