0

特定のポートでリッスンしているデバイスを見つけるために、範囲(IE 192.168.5.0-192.168.5.255)内のすべてのIPをループする最良の方法を見つけようとしています。次のコードは機能していますが、ソケットのタイムアウトが低すぎるため、すべてのデバイスが見つからないのではないかと心配しています。キャッチ22は、これを超高速にしたいのですが、タイムアウトを増やすと、永遠にかかり始めます。

private class findNetworkDevices extends AsyncTask<String, Integer, String> {

    private String source;
    private Activity activity;
    private Context context;
    public findNetworkDevices(Activity activity) {
        this.activity = activity;
        context = activity;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        for (int dest = 0; dest < 255; dest++) {
            String host = "192.168.5." + dest; // TODO: add net address instead of hardcoding
            try {
                Socket s = new Socket();
                s.connect(new InetSocketAddress(InetAddress.getByName(host), 9999), 50);
                Log.v(LOG_TAG, "conn:" + s.toString());
                if (s.isConnected()) {
                    Log.v(LOG_TAG, "connected " + host);
                    foundDevicesArray.add(host);
                } else {
                    return "failed";
                }
            } catch (Exception e) {
                Log.e(LOG_TAG, "Not found", e);
            }
            }
            Log.v(LOG_TAG, "end");

            return "All Done!";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            ListView lv = (ListView) activity.findViewById(R.id.foundDevicesList);
            ((BaseAdapter) lv.getAdapter()).notifyDataSetChanged();

        }
    }

前もって感謝します。

4

1 に答える 1

0

時間がかかったので、Asyncの使用をやめました。私はExecutorServiceに行きました

        ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS);
    String ip = getLocalIpAddress();
    int endIndex = ip.lastIndexOf(".");
    String subnet = ip.substring(0, endIndex);
    for (int dest = 0; dest < 255; dest++) {
        String host = subnet + "." + dest;
        executor.execute(pingRunnable(host));
    }

Asyncがバックグラウンドで実行した複数のスレッドを生成しているようですが、1つのスレッドでのみ生成されます。

于 2013-02-28T21:37:00.627 に答える