如何持续检查IP是否可达?

时间:2014-03-20 06:23:48

标签: java android networking

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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

拥有后台服务,如果可以访问IP,则每隔5分钟检查一次。如果是,请启动同步过程。

答案 1 :(得分:1)

我的想法如下:

答案 2 :(得分:0)

以下是可以执行此操作的服务。为了更容易理解,它使用CountDownTimer来处理循环,使用匿名线程来保持网络操作不受主线程的影响。理想情况下,这些应该可以组合在一个处理程序中。此外,除非将更好的同步方法应用于' sycing'保护条件,与CHECK_FREQ_MSECS相比,TIME_OUT_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;
    }
}