首先需要进行在linux的环境下进行查看(可以用android studio中的Terminal中的命令面板操作 :输入 adb shell 回车即可执行liunx命令)
例:某厂商反馈某第三方app占用了端口, 导致CTS测试通不过, 需要协助分析是否是app引起问题。于是需要在网上找怎么在android上查看进程占用端口情况,
- 1. 在linux中可以使用netstat命令查看(参考http://4ujava.iteye.com/blog/548153), 但是Android自带netstat命令不支持p参数, 所以无法查出pid
- 2. 在Android上可以使用busybox工具, busybox中的netstat命令支持p参数, 可以查出pid (见下图最后一列)
- 在命令面板中输入:netstat -tlp 或者 netstat -tln
- 代码示例
List list = new ArrayList<>();
public void onclick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
test();
for (Integer integer : list) {
L.e("可以使用的端口有:" + integer);
}
}
private void test() {
Socket socket = null;
//端口范围:0~65535
for(int i=0;i<65536;i++){
try {
// String ip = getLocalIpAddress();
// L.e("本地IP:" + ip);
//创建Socket
socket = new Socket("127.0.0.1", i); //IP:10.0.2.2,端口54321
//L.e("连接成功");
/**
* sClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false .
isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .
isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .
L.e("socket.isBound--" + socket.isBound());
L.e("socket.isClosed--" + socket.isClosed());
L.e("socket.isConnected--" + socket.isConnected());
L.e("socket.isInputShutdown--" + socket.isInputShutdown());
L.e("socket.isOutputShutdown--" + socket.isOutputShutdown());
L.e("------------------------");
*/
boolean isConnected = socket.isConnected() && !socket.isClosed();
if (isConnected) {
list.add(i);
}
//关闭Socket
socket.close();
} catch (Exception e) {
// TODO: handle exception
L.e(e.toString());
}
}
}
}).start();
}
//获取本地IP
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
L.e("WifiPreference IpAddress" + ex.toString());
}
return null;
}