주어진 포트에서 수신 대기하는 장치를 찾으려면 범위 (IE 192.168.5.0-192.168.5.255)의 모든 ips를 반복하는 가장 좋은 방법을 찾아야합니다. 다음 코드는 작동하지만 소켓이 너무 작아서 모든 장치를 찾지 못할까 걱정됩니다. 캐치 22는 내가 이것을 매우 빠르 길 원한다.하지만 내가 타임 아웃을하면 영원히 시작된다.안드로이드 Asynctask에 대한 소켓 검색
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();
}
}
미리 감사드립니다.
작은 최적화. 루프 밖에서'Socket s'을 static으로 만들어야합니다. 매 루프마다 그것을 재 작성하는 대신 재사용하십시오. 그것은's.connect()'에 비해서는 작을 수 있지만 코드를 더 빨리 만들 것입니다. – ilomambo