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

8 篇文章 0 订阅

首先需要进行在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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值