• 【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享


    一、软件功能与截图

    做一款面向网络运维人员的IP通断状态检测小软件,核心是通过运行Ping命令拿到IP网络状态,目前有一个简陋UI界面,支持批量导入Excel格式的IP数据,然后自动检测网络通断。软件本体是jar包,可以通过exe4j工具打包为Windows PC机下运行的EXE程序,也可以运行到Linux操作系统。
    该文档不定时更新。
    未来打算支持功能点有:

    • 将支持单个IP做网络通断测试,即每一个IP旁边放置一个按钮
    • 将支持将IP检测结果表格导出为PDF或图片,方便分享数据
    • 将支持自动不定时对IP地址做检测,动态更新检测结果
    • 计划增加多线程,缩短响应时间

    多Excel文档批量导入IP信息

    1.文件支持选择多个Excel文档

    在这里插入图片描述

    2.Excel文件的表头要求

    表头名字随便取,顺序必须与截图保持一致
    在这里插入图片描述

    IP信息Ping结果列表展示

    解析结果

    二、源码分享与设计

    Maven-Pom依赖

    
            <dependency>
                <groupId>org.apache.poigroupId>
                <artifactId>poiartifactId>
                <version>4.1.2version>
            dependency>
            <dependency>
                <groupId>org.apache.poigroupId>
                <artifactId>poi-ooxmlartifactId>
                <version>4.1.2version>
            dependency>
            <dependency>
                <groupId>org.apache.poigroupId>
                <artifactId>poi-ooxml-schemasartifactId>
                <version>4.1.2version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Excel数据导入-基于POI

    • 负责解析Excel数据为Java对象PingInfoInputDTO的方法类:MyExcelServiceImpl
    public class MyExcelServiceImpl implements  EasyExcelService {
        @Override
        public List<PingInfoInputDTO> readExcel(File file) {
            try {
    //            HSSFWorkbook workBook = new HSSFWorkbook(new FileInputStream(new File(file.getAbsolutePath())));
                HSSFWorkbook workBook = new HSSFWorkbook(new FileInputStream(file));
                //页
                int sheetNum = workBook.getNumberOfSheets();
                DataFormatter cellDataFormatter = new DataFormatter();
                List<PingInfoInputDTO> pingInfoList = new ArrayList<>(300);
                for( int i=0; i<sheetNum; i++ ){
                    HSSFSheet sheetData =  workBook.getSheetAt(i);
                    //行:每行数据对应一个对象
                    int lastRowNum = sheetData.getLastRowNum();
                    for( int j=1; j<lastRowNum ; j++){
                        //跳过首行表头,j=1
                        HSSFRow rowData = sheetData.getRow(j);
                        //单元格
                        short lastCellNum = rowData.getLastCellNum();
                        PingInfoInputDTO pingDTO = new PingInfoInputDTO();
                        int k = 0;
                        //IpNo数据编号
                        pingDTO.setIpNo(cellDataFormatter.formatCellValue(rowData.getCell(k++)));
                        //IP地址别名
                        pingDTO.setIpAliasName(cellDataFormatter.formatCellValue(rowData.getCell(k++)));
                        //IP地址
                        pingDTO.setIpAddress(cellDataFormatter.formatCellValue(rowData.getCell(k++)));
                        //Ping超时
                        pingDTO.setPingTimeout(cellDataFormatter.formatCellValue(rowData.getCell(k++)));
                        //最大Ping次数
                        pingDTO.setPingMaxCount(cellDataFormatter.formatCellValue(rowData.getCell(k++)));
    
                        pingInfoList.add(pingDTO);
                    }
                }
                workBook.close();
                return pingInfoList;
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return new ArrayList<>();
            } catch (IOException e) {
                e.printStackTrace();
                return new ArrayList<>();
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 接口层 EasyExcelService.java
    public interface EasyExcelService {
       List<PingInfoInputDTO> readExcel(File file);
    }
    
    • 1
    • 2
    • 3
    • POJO:PingInfoInputDTO
    public class PingInfoInputDTO {
    
        //数据标识和序号
        private String ipNo;
        //Ping 目标地址
        private String ipAddress;
        //Ping地址别名
        private String ipAliasName;
        //Ping超时设置,默认1000ms
        private String pingTimeout;
        //Ping次数上限
        private String pingMaxCount;
    
    
        public String getIpAddress() {
            return ipAddress;
        }
    
        public void setIpAddress(String ipAddress) {
            this.ipAddress = ipAddress;
        }
    
        public String getPingTimeout() {
            return pingTimeout;
        }
    
        public void setPingTimeout(String pingTimeout) {
            this.pingTimeout = pingTimeout;
        }
    
        public String getPingMaxCount() {
            return pingMaxCount;
        }
    
        public void setPingMaxCount(String pingMaxCount) {
            this.pingMaxCount = pingMaxCount;
        }
    
        public String getIpAliasName() {
            return ipAliasName;
        }
    
        public void setIpAliasName(String ipAliasName) {
            this.ipAliasName = ipAliasName;
        }
    
        public String getIpNo() {
            return ipNo;
        }
    
        public void setIpNo(String ipNo) {
            this.ipNo = ipNo;
        }
    
        @Override
        public String toString() {
            return "PingInfoInputDTO{" +
                    "ipNo='" + ipNo + '\'' +
                    ", ipAddress='" + ipAddress + '\'' +
                    ", ipAliasName='" + ipAliasName + '\'' +
                    ", pingTimeout='" + pingTimeout + '\'' +
                    ", pingMaxCount='" + pingMaxCount + '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    IP地址Ping方法-

    • 实现类
    public class PingServiceImpl implements PingService {
    
    
        public PingInfoOutputDTO ping(PingInfoInputDTO infoInputDTO) {
            PingInfoOutputDTO outputDTO = new PingInfoOutputDTO();
            outputDTO.setInputDTO(infoInputDTO);
            outputDTO.setTargetIp(infoInputDTO.getIpAddress());
    
            BufferedReader in = null;
            String pingCommand = null;
            Runtime r = Runtime.getRuntime();
            String osName = System.getProperty("os.name");
            if(osName.contains("Windows")){
                //Windows Style: ping www.baidu.com -n 3
                pingCommand = "ping " + infoInputDTO.getIpAddress() + " -n " + infoInputDTO.getPingMaxCount();
            }else{
                //Linux Style: ping -c 10 www.baidu.com
                pingCommand = "ping " + " -c " + infoInputDTO.getPingMaxCount() + "  " +  infoInputDTO.getIpAddress();
            }
            try {
                //Process
                System.out.println("To process command:" + pingCommand);
                Process p = r.exec(pingCommand);
                if (p == null) {
                    outputDTO.setPingStatus(false);
                    outputDTO.setPingRes("System Error!");
                    outputDTO.setPingResponseTime(new Date());
                }
                //Check
                in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                int connectedCount = 0;
                String line = null;
                while ((line = in.readLine()) != null) {
                    if(osName.contains("Windows")){
                        if(line.contains("TTL=")){
                            connectedCount++;
                        }
                    }else{
                        if(line.contains("ttl=")){
                            connectedCount++;
                        }
                    }
                }
                System.out.println("IP: " + infoInputDTO.getIpAddress() +  ",Ping Success Count:" +connectedCount);
                if(connectedCount >= 1){
                    outputDTO.setPingResponseTime(new Date());
                    outputDTO.setPingStatus(true);
                    outputDTO.setPingRes("连通");
                }else{
                    outputDTO.setPingResponseTime(new Date());
                    outputDTO.setPingStatus(false);
                    outputDTO.setPingRes("故障");
                }
                return outputDTO;
            } catch (Exception ex) {
                ex.printStackTrace();
                return null;
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 接口定义
    public interface PingService {
    
        PingInfoOutputDTO ping(PingInfoInputDTO infoInputDTO);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    GUI界面-Java Swing-程序入口

    本类同时也是程序的入口

    public class FrameUITest {
    
    
        public static void main(String[] args) {
    
            //校验通过的文件类型
            List<File> VALID_FILE_LIST = new ArrayList<File>(6);
            //校验失败的文件类型
            List<File> INVALID_FILE_LIST = new ArrayList<File>(6);
    
            int frameWidth = 700;
            int frameHeight = 500;
    
            SimpleDateFormat simpleDateFormat =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            String appTitle = "小平头网络IP地址通讯状态检测工具PingTow2.0";
            //统一设置字体
            InitGlobalFont(new Font("alias", Font.PLAIN, 18));
            JFrame frame = new JFrame(appTitle);
            frame.setSize(frameWidth, frameHeight);
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
    
            // 创建内容面板,指定使用 流式布局
            JPanel panel = new JPanel(new FlowLayout());
    //        JPanel panel = new JPanel(new GridLayout(3,1));
    
            //显示用户所选文件名称
            JLabel fileNameLabel = new JLabel();
            fileNameLabel.setText("您选择的文件是:_______");
            fileNameLabel.setFont(new Font(null, Font.PLAIN, 15));
            fileNameLabel.setSize(300,80);
            panel.add(fileNameLabel);
    
            //用于文件上传的按钮
            JButton fileUploadBtn = new JButton("       上传Excel文件      ");
            fileUploadBtn.setSize(400,80);
    
            fileUploadBtn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //点击按钮后打开文本框
                    JFileChooser chooser = new JFileChooser();
                    //开启文件多选
                    chooser.setMultiSelectionEnabled(true);
                    /** 过滤文件类型 * */
                    FileNameExtensionFilter filter = new FileNameExtensionFilter("","xls");
                    chooser.setFileFilter(filter);
                    int returnVal = chooser.showOpenDialog(fileUploadBtn);
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
                        //选择的文件
                        File[] fileArr = chooser.getSelectedFiles();
                        if (fileArr == null || fileArr.length == 0) {
                            JOptionPane.showMessageDialog(new JDialog(), "错误!请正确选择文件.");
                            return;
                        }
                        //循环校验所选文件的类型
                        StringBuilder fileNameBuilder = new StringBuilder();
                        for (File item : fileArr) {
                            //判断是否有文件为xls或xlsx
                            String fileName = item.getName();
                            String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
                            if ((prefix.equals("xls") || prefix.equals("xlsx"))) {
                                VALID_FILE_LIST.add(item);
                                fileNameBuilder.append(fileName);
                            } else {
                                INVALID_FILE_LIST.add(item);
                            }
                        }
                        //更新UI界面用户所选文件
                        fileNameLabel.setText("您所选文件是:" + fileNameBuilder.toString());
                        System.out.println("有效文件:" + VALID_FILE_LIST + ",无效文件:" + INVALID_FILE_LIST);
    
                        //检测IP
                        //Excel File -> PingInfoInputDTO
                        List<PingInfoInputDTO> pingInfoList = new ArrayList<>(100);
                        EasyExcelService excelService = new MyExcelServiceImpl();
                        if(CollectionUtils.isNotEmpty(VALID_FILE_LIST) && !CollectionUtils.sizeIsEmpty(VALID_FILE_LIST)){
                            for (File file : VALID_FILE_LIST) {
                                List<PingInfoInputDTO> list = excelService.readExcel(file);
                                pingInfoList.addAll(list);
                            }
                        }
                        //检测IP
                        List<PingInfoOutputDTO> outPutList = new ArrayList<>(100);
                        PingService pingService = new PingServiceImpl();
                        if(CollectionUtils.isNotEmpty(pingInfoList) && !CollectionUtils.sizeIsEmpty(pingInfoList)){
                            for (PingInfoInputDTO item : pingInfoList) {
                                PingInfoOutputDTO out = pingService.ping(item);
                                outPutList.add(out);
                            }
                        }
                        //放一个列表展示解析结果
                           //转化为二维数组
                        String[][] tableData = new String[outPutList.size()][5];
                        int i=0;
                        for (PingInfoOutputDTO item : outPutList) {
                            PingInfoInputDTO inputDTO = item.getInputDTO();
                            tableData[i][0] = inputDTO.getIpNo();
                            tableData[i][1] = inputDTO.getIpAddress();
                            tableData[i][2] = inputDTO.getIpAliasName();
                            tableData[i][3] = item.getPingRes();
                            tableData[i][4] = simpleDateFormat.format(item.getPingResponseTime());
                            i++;
                        }
    
                        Object[] columnNames = {"序号", "   IP地址   ","    IP简称    ", " 网络状态  ", "   操作时间   "};
                        // 创建一个表格,指定 所有行数据 和 表头
                        JTable table = new JTable(tableData, columnNames);
                        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                        table.setForeground(new Color(100,200,80));
                        table.setShowGrid(true);
                        table.setRowHeight(40);
                        table.setPreferredScrollableViewportSize(new Dimension((int)0.8*frameWidth,(int)0.8*frameHeight));
    
    
                        // 把 表头 添加到容器顶部(使用普通的中间容器添加表格时,表头 和 内容 需要分开添加)
                        panel.add(table.getTableHeader(), BorderLayout.NORTH);
                        // 把 表格内容 添加到容器中心
                        panel.add(table, BorderLayout.CENTER);
    
                    }
                }
            });
            panel.add(fileUploadBtn);
    
    
            frame.setContentPane(panel);
    
            frame.setVisible(true);
        }
    
        /**
         * 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体
         */
        private static void InitGlobalFont(Font font) {
            FontUIResource fontRes = new FontUIResource(font);
            for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
                Object key = keys.nextElement();
                Object value = UIManager.get(key);
                if (value instanceof FontUIResource) {
                    UIManager.put(key, fontRes);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146

    继续你的创作。

  • 相关阅读:
    Kotlin第一弹:Kotlin详细介绍
    C++ 重载运算符,语法+示例,非常详细!!!
    【域泛化】2022 IJCAI领域泛化教程报告
    DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之十大知识领域之4辅助—项目沟通管理
    Java学习第一课
    概述UVM中的build、configure和connect【uvm】
    idea所有历史版本下载
    C++ 类
    QT连接MySQL数据库,手动编译动态链接库,解决QMYSQL driver not loaded错误
    零信任沙盒,加密沙盒,防泄密沙盒
  • 原文地址:https://blog.csdn.net/qq_37040173/article/details/126459185