Java 用于套接字扫描的Android异步任务
我正试图找出在一定范围内(即192.168.5.0-192.168.5.255)循环所有IP的最佳方法,以查找在给定端口上侦听的设备。下面的代码正在运行,但我担心找不到所有的设备,因为我的套接字超时太低了。第22个问题是,我希望这是超快速的,但如果我超过了超时时间,它将开始永远持续下去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
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吗?。。从那里创建线程来加速进程,或者直接从主线程调用线程没有任何区别。。。