通过使用Socket来扫描获取手机中可使用的端口

来源:互联网 发布:滨州行知中学电话 编辑:程序博客网 时间:2024/06/02 00:31

首先需要进行在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;    }
阅读全文
0 0
原创粉丝点击