Java 用于套接字扫描的Android异步任务

Java 用于套接字扫描的Android异步任务,java,android,sockets,Java,Android,Sockets,我正试图找出在一定范围内(即192.168.5.0-192.168.5.255)循环所有IP的最佳方法,以查找在给定端口上侦听的设备。下面的代码正在运行,但我担心找不到所有的设备,因为我的套接字超时太低了。第22个问题是,我希望这是超快速的,但如果我超过了超时时间,它将开始永远持续下去 private class findNetworkDevices extends AsyncTask<String, Integer, String> { private String so

我正试图找出在一定范围内(即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();

        }
    }
私有类findNetworkDevices扩展异步任务{
私有字符串源;
私人活动;
私人语境;
公共findNetworkDevices(活动){
这个。活动=活动;
上下文=活动;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
对于(int dest=0;dest<255;dest++){
String host=“192.168.5”。+dest;//TODO:添加网络地址而不是硬编码
试一试{
套接字s=新套接字();
s、 connect(新的InetSocketAddress(InetAddress.getByName(主机),9999),50);
Log.v(Log_标签,“conn:+s.toString());
如果(s.断开连接()){
Log.v(日志标签,“已连接”+主机);
FoundDeviceArray.add(主机);
}否则{
返回“失败”;
}
}捕获(例外e){
Log.e(日志标签“未找到”,e);
}
}
Log.v(Log_标签“end”);
返回“全部完成!”;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
ListView lv=(ListView)activity.findViewById(R.id.FoundDeviceList);
((BaseAdapter)lv.getAdapter()).notifyDataSetChanged();
}
}

提前感谢。

我不再使用异步,因为它花了太长时间。我和他一起去的

        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));
    }
ExecutorService executor=Executors.newFixedThreadPool(NB_线程);
字符串ip=getLocalIpAddress();
int endIndex=ip.lastIndexOf(“.”);
字符串subnet=ip.substring(0,endIndex);
对于(int dest=0;dest<255;dest++){
字符串主机=子网+“+dest;
executor.execute(pingRunnable(host));
}

它似乎产生了多个线程,其中Async是在后台完成的,但只在一个线程中完成。

只是一个小优化。您应该使
sockets
在循环外保持静态并重用它,而不是在每个循环中重新创建它。与
s.connect()
相比,它可能很小,但肯定会使您的代码更快。Android开发人员文档不建议对任何后台操作使用asynctask吗?。。从那里创建线程来加速进程,或者直接从主线程调用线程没有任何区别。。。