項目中需要搜索同一WIFI局域網中的設備並進行通信,暫時想到的辦法是得到局域網網段的地址,因為同一局域網中的IP地址前三位是相同的,而第四位的范圍從0~250,所以對第四位進行遍歷搜索,能ping通的IP加入在線列表,再用IP進行通信。由於遍歷過程非常耗時,需要開啟多線程去PING.開銷不能太大,最多開啟30個線程。
需要在Android中使用LInux底層的命令:
如執行Ping命令 格式為 ping -c 1 -w 5
其中參數-c 1是指ping的次數為1次,-w是指執行的最后期限,單位為秒,也就是執行的時間為5秒,超過5秒則失敗.
Ping命令代碼:
Process p = Runtime.getRuntime().exec("ping -c 1 -w 5 " + ip);
主要的代碼部分:
public void runPingIPprocess(final String ipString)
{
final Thread pingThread = new Thread()
{
@Override
public void run()
{
try
{
Log.i("Light", "ip address" + ipString);
// ping ip地址
Process p = Runtime.getRuntime().exec(
"ping -c 1 -w 5 " + ipString);
int status = p.waitFor();
if (status == 0)
{
Log.i("Light", "ping ip");
Map<String, Object> map = new HashMap<String, Object>();
map.put("ip", ipString);
ping.add(map);
pingSize++;
if (pingSize > 10)
{
pingSize = 0;
// setPing(ping);
mUpdaHandler.sendMessage(createMessage(RESULT_MESSAGE, ping));
}
} else
{
}
threadCount--;
} catch (Exception e)
{
threadCount--;
Log.e("Light", e.getLocalizedMessage());
} finally
{
}
}
};
pingThread.start();
}
主要來講講 Runtime.exec這個方法
Runtime 封裝着java程序的運行時環境。通過Runtime實例,java應用能夠與其運行的環境連接。Runtime在jvm中保持一個單例,所以不能通過Runtime類的構造函數。只能通過Runtime.getRuntime()來獲的當前Runtime的一個實例。獲得Runtime實例后,就可以通過Runtime的exec()方法在當前jvm進程外啟動其他進程了。
在Runtime類中存在四個exec()重載方法
public Process exec(String command);
public Process exec(String [] cmdArray);
public Process exec(String command, String [] envp);
public Process exec(String [] cmdArray, String [] envp);
對於每個這樣的方法,都會產生一個命令,並可能攜帶一組參數——被傳遞給一個特定操作系統的函數調用。隨后創建一個特定操作系統的進程(一個運行着的程序),procss類將持有該程序返回Java VM的引用。這個procss類是一個抽象類,具體子類的實現依賴於不同的底層操作系統。
你可以通過三種可能的輸入參數到這些方法:
1、一個字符串,表示程序執行和程序的任何參數。
2、一個字符串數組,通過參數來區分出程序的實現功能。
3、一個環境變量的數組
傳遞環境變量是,使用格式化的方式:名稱=值。如果你使用單個字符串和它的參數的方式調用exec()的重載,,注意字符串是通過StringTokenizer類被解析,使用空格作為分隔符
關於Runtime類使用陷阱可以看看這篇文章:
http://www.cfanz.cn/index.php?c=article&a=read&id=33583
完整的實例代碼:
http://download.csdn.net/detail/u011176244/6348059