मुझे जो समस्या हो रही है वह नेटवर्क पर सभी पहुंच योग्य ग्राहकों को प्राप्त कर रही है। नीचे दी गई विधि कुछ क्लाइंट को कॉल करने पर लौटाती है। ज्यादातर मामलों में अन्य एंड्रॉइड क्लाइंट। हालांकि पीसी के लिए यह विफल हो जाता है जब फ़ायरवॉल चालू होता है। क्या जावा/एंड्रॉइड में सभी क्लाइंट को पूरी तरह से प्राप्त करने का एक अधिक प्रभावी तरीका है या क्या मुझे एंड्रॉइड एनडीके का उपयोग करने की आवश्यकता होगी? इस डोमेन के विशेषज्ञों से कोई मदद मिलेगी सराहना की जाए। अग्रिम धन्यवाद।

    /***
     *  ping_JavaStyle(final int j)
     *  uses multi threads to enhance performance
     *  while pinging from  0>j<=255
     * @param j
     */
    private void ping_JavaStyle(final int j)
    {
        new Thread(new Runnable() {   // new thread for parallel execution

            public void run() {
                try {
                    String testIp = prefix + String.valueOf(j);
                    InetAddress address = InetAddress.getByName(testIp);
                    String output = address.toString().substring(1);


                    if (address.isReachable(3000)) {
                        System.out.println(output + " is on the network");
                        ipList.add(testIp);
                    } else {

                        if (retest(testIp, 139)) {
                            ipList.add(testIp);
                        } else {
                            System.out.println("Not Reachable: " + output);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }
0
Kirk Patrick Brown 29 अक्टूबर 2017, 10:01

1 उत्तर

सबसे बढ़िया उत्तर

कुछ और शोध करने के बाद, यह काम कर रहा है। इस रेपो की मदद से:https://github.com/stealthcopter/AndroidNetworkTools

नीचे कोड समस्या हल करता है:

  ** RunnableTask.Java
 * Created by Kirk on 10/29/2017.
 */

public class RunnableTask implements Callable<Boolean> {

private String testIp = "";
private Boolean is_Reachable = false;


public RunnableTask(String testIp) {
    this.testIp = testIp;
}

@Override
public Boolean call() throws Exception {
    try {
        PingResult pingResult = Ping.onAddress(this.testIp).setTimes(1).setTimeOutMillis(1500).doPing();

        if (pingResult.isReachable) {
            is_Reachable = true;
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

    return is_Reachable;

  }
}

और कॉलर विधि में उपयोग करें:

private static final int NTHREDS = 255;


    //.......
        ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
        List<Future<Boolean>> thread_Values_list = new ArrayList<>();
        for (int i = 1; i <= 255; i++) {
            final int j = i;
            try {
                try {
                    String testIp = prefix + String.valueOf(j);
                    RunnableTask worker = new RunnableTask(testIp);
                    Future<Boolean> submit = executor.submit(worker);
                    thread_Values_list.add(submit);

                } catch (Exception e) {
                    e.printStackTrace();
                }


            } catch (Exception e) {


            }
        }
        for (Future<Boolean> finishedThread : thread_Values_list) {

            String reachable_Ip = "";
            try {
                if (finishedThread.get()) {
                    reachable_Ip = prefix + String.valueOf(finishThread_counter);
                    ipList.add(reachable_Ip);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            finishThread_counter++;
        }

        executor.shutdown();
    }
1
Kirk Patrick Brown 30 अक्टूबर 2017, 07:38