这就是最终效果。用了WindowBuilder构建gui。

开始捕获就去抓包,抓完包就存到数据库,并且回调到主线程中显示(有种Android既视感,只不过Android比JavaGui复杂无数倍)

用到的JList、JSipnner、JComBox控件

public class MainWindow implements CaptureListener {    // 数目    JLabel LabelTotal, LabelIP, LabelTCP, LabelUDP;    private JFrame frame;    JpcapCaptor jpcap;    // list    JList list;    // 抓包总数目    JSpinner sp_total_size;    // 包下拉    JComboBox box_packet_type;    // 抓取后的监听    CaptureListener listener;    // 抓包线程    Thread capThread;    // 接收回调类    TestPacketReceiver receiver;    // 网卡信息类    NetworkInterface nc;    NetworkInterface[] devices;    // 网卡的adapter    ComboBoxModel box_packet_type_mode;    // list adapter    DefaultListModel dlm;    // 全部    int spinner_num = -1;    int totalCount;    List allList = new ArrayList();    List ipList = new ArrayList();    List tcpList = new ArrayList();    List udpList = new ArrayList();    /**     * Launch the application.     */    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() {            public void run() {                try {                    MainWindow window = new MainWindow();                    window.frame.setVisible(true);                    /*                     * TimerTask task = new TimerTask(){                     *                      * @Override public void run() { // TODO Auto-generated                     * method stub                     *                      * } }; Timer timer = new Timer(); timer.schedule(task,                     * 1000);                     */                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the application.     */    public MainWindow() {        initialize();    }    /**     * Initialize the contents of the frame.     */    private void initialize() {        frame = new JFrame();        frame.setBounds(100, 100, 716, 641);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.getContentPane().setLayout(null);        JButton bt_start = new JButton("\u5F00\u59CB\u6355\u83B7");        bt_start.addMouseListener(new MouseAdapter() {            @Override            public void mouseClicked(MouseEvent e) {                if (null == nc) {                    nc = devices[0];                    box_packet_type_mode.setSelectedItem(nc);                }                try {                    jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);                    startCapThread(jpcap);                } catch (Exception ef) {                    ef.printStackTrace();                    System.out.println("启动失败:  " + ef);                }            }        });        bt_start.setBounds(14, 145, 113, 27);        frame.getContentPane().add(bt_start);        JButton bt_stop = new JButton("\u505C\u6B62\u6355\u83B7");        bt_stop.addMouseListener(new MouseAdapter() {            @Override            public void mouseClicked(MouseEvent e) {                jpcap.close();                // 移除监听                receiver.removeListener();            }        });        bt_stop.setBounds(159, 145, 113, 27);        frame.getContentPane().add(bt_stop);        JLabel label = new JLabel("\u76EE\u6807\u603B\u6570\uFF1A");        label.setBounds(18, 89, 104, 18);        frame.getContentPane().add(label);        sp_total_size = new JSpinner();        sp_total_size.setBounds(98, 85, 64, 24);        frame.getContentPane().add(sp_total_size);        JLabel label_1 = new JLabel("\u5F53\u524D\u65E0\u9650\u6355\u83B7");        label_1.setBounds(171, 87, 134, 18);        frame.getContentPane().add(label_1);        JProgressBar progressBar = new JProgressBar();        progressBar.setBounds(16, 567, 935, 14);        frame.getContentPane().add(progressBar);        // 包选择        String[] s = { "All","IP", "TCP", "UDP" };        box_packet_type = new JComboBox(s);        box_packet_type.setBounds(159, 195, 113, 24);        frame.getContentPane().add(box_packet_type);        box_packet_type.addActionListener(new comboxListener());        JLabel label_2 = new JLabel(                "\u9009\u62E9\u6570\u636E\u5305\u7C7B\u578B\uFF1A");        label_2.setBounds(14, 198, 202, 18);        frame.getContentPane().add(label_2);        // 网卡下拉菜单        devices = JpcapCaptor.getDeviceList();        box_packet_type_mode = new NetCardDataModel(devices);        JComboBox box_netcard = new JComboBox(box_packet_type_mode);        box_netcard.setBounds(98, 21, 174, 24);        frame.getContentPane().add(box_netcard);        JLabel label_3 = new JLabel("\u76EE\u6807\u7F51\u5361\uFF1A");        label_3.setBounds(18, 24, 88, 18);        frame.getContentPane().add(label_3);        list = new JList();        list.setBounds(18, 247, 677, 294);        frame.getContentPane().add(list);        JScrollPane scrollPane = new JScrollPane(list);        scrollPane.setBounds(18, 247, 677, 294);        frame.getContentPane().add(scrollPane);        dlm = new DefaultListModel();        LabelTotal = new JLabel("\u603B\u6570\uFF1A");        LabelTotal.setFont(new Font("宋体", Font.PLAIN, 20));        LabelTotal.setBounds(397, 24, 93, 18);        frame.getContentPane().add(LabelTotal);        LabelIP = new JLabel("IP\u6570\uFF1A");        LabelIP.setFont(new Font("宋体", Font.PLAIN, 20));        LabelIP.setBounds(397, 87, 93, 18);        frame.getContentPane().add(LabelIP);        LabelTCP = new JLabel("TCP\u6570\uFF1A");        LabelTCP.setFont(new Font("宋体", Font.PLAIN, 20));        LabelTCP.setBounds(397, 150, 93, 18);        frame.getContentPane().add(LabelTCP);        LabelUDP = new JLabel("UDP\u6570\uFF1A");        LabelUDP.setFont(new Font("宋体", Font.PLAIN, 20));        LabelUDP.setBounds(397, 213, 93, 18);        frame.getContentPane().add(LabelUDP);    }    // 将每个Captor放到独立线程中运行    public void startCapThread(final JpcapCaptor jpcap) {        java.lang.Runnable rnner = new Runnable() {            public void run() {                // 使用接包处理器循环抓包                receiver = new TestPacketReceiver();                receiver.setCaptureListener(MainWindow.this);                jpcap.loopPacket(spinner_num, receiver);            }        };        capThread = new Thread(rnner);        capThread.start();        // 启动抓包线程    }    @Override    public void capture(Object obj, String tpye, int totalCount, int curCount) {        // TODO Auto-generated method stub        allList.add((IPCapPacket)obj);        LabelTotal.setText("全部:" + totalCount);        if ("IP".equals(tpye)) {            dlm.addElement((IPCapPacket) obj);            ipList.add((IPCapPacket) obj);            if (ipList.size() % 30 == 0) {                list.setModel(dlm);            }            LabelIP.setText("IP:" + curCount);        } else if ("TCP".equals(tpye)) {            dlm.addElement((TCPCapPacket) obj);            tcpList.add((TCPCapPacket) obj);            if (tcpList.size() % 30 == 0) {                list.setModel(dlm);            }            LabelTCP.setText("TCP:" + curCount);        } else if ("UDP".equals(tpye)) {            dlm.addElement((UDPCapPacket) obj);            udpList.add((UDPCapPacket) obj);            if (udpList.size() % 30 == 0) {                list.setModel(dlm);            }            LabelUDP.setText("UDP:" + curCount);        }    }    private class comboxListener implements ActionListener {        public void actionPerformed(ActionEvent e) {            long o = e.getWhen();            switch (box_packet_type.getSelectedItem().toString()) {            case "All":                dlm.clear();                for (int i = 0; i < ipList.size(); i++) {                    dlm.addElement((IPCapPacket)ipList.get(i));                }                break;            case "IP":                dlm.clear();                for (int i = 0; i < ipList.size(); i++) {                    dlm.addElement((IPCapPacket)ipList.get(i));                }                break;            case "TCP":                dlm.clear();                for (int i = 0; i < tcpList.size(); i++) {                    dlm.addElement((TCPCapPacket)tcpList.get(i));                }                break;            case "UDP":                dlm.clear();                for (int i = 0; i break;            default:                break;            }        }    }}   

抓包监听

/** * 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明 *  */class TestPacketReceiver implements PacketReceiver {    CaptureListener captureListener;    int totalCount = 0;    static MongoDbHelper2 helper;    int a, b, c;    public TestPacketReceiver() {        // TODO Auto-generated constructor stub        helper = MongoDbHelper2.getInstance();        helper.getConnection();    }    /**     * 实现的接包方法:     */    public void receivePacket(Packet packet) {        if (packet instanceof jpcap.packet.IPPacket) {            IPPacket p = (IPPacket) packet;            IPCapPacket pCapPacket = new IPCapPacket();            // /192.168.1.102            pCapPacket.setDestinationAddress(p.dst_ip + "");            // /172.24.6.57            pCapPacket.setSourceAddress(p.src_ip + "");            // 4            pCapPacket.setVersionAndlength(p.version + "");            // 0            pCapPacket.setTypeOfService(p.rsv_tos + "");            // 212            pCapPacket.setTotalLength(p.length + "");            // 28372            pCapPacket.setIdetifier(p.ident + "");            // false0            pCapPacket.setFlagsAndOffser(p.d_flag + "" + p.offset);            // 59            pCapPacket.setTimeToLive(p.hop_limit + "");            // 17            pCapPacket.setProtocol(p.protocol + "");            // pCapPacket.setChecksum();            a++;            totalCount++;            helper.insert(MongoDbHelper.IPCollection, pCapPacket);            if (captureListener != null) {                captureListener.capture(pCapPacket, "IP", totalCount, a);            }            // System.out.println("insert:"+m);        }        // Tcp包,在java Socket中只能得到负载数据        if (packet instanceof jpcap.packet.TCPPacket) {            TCPPacket p = (TCPPacket) packet;            TCPCapPacket pCapPacket = new TCPCapPacket();            pCapPacket.setDestinationAddress(p.dst_ip + "");            pCapPacket.setDestinationPort(p.dst_port + "");            pCapPacket.setDestinationAddress(p.src_ip + "");            pCapPacket.setSourcePort(p.src_port + "");            pCapPacket.setSerialNumber(p.sec + "");            pCapPacket.setConfrimNumber(p.ack_num + "");            pCapPacket.setWindowSize(p.window + "");            // pCapPacket.setTcpCheckSum();            pCapPacket.setUrgentPointer(p.urgent_pointer + "");            b++;            totalCount++;            helper.insert(MongoDbHelper.TCPCollection, pCapPacket);            if (captureListener != null) {                captureListener.capture(pCapPacket, "TCP", totalCount, b);            }        }        if (packet instanceof jpcap.packet.UDPPacket) {            UDPPacket p = (UDPPacket) packet;            UDPCapPacket udpCapPacket = new UDPCapPacket();            udpCapPacket.setDestinationAddress(p.dst_ip + "");            udpCapPacket.setDestinationPort(p.dst_port + "");            udpCapPacket.setDestinationAddress(p.src_ip + "");            udpCapPacket.setSourcePort(p.src_port + "");            // udpCapPacket.setCheckSum();            udpCapPacket.setUdpLength(p.len);            c++;            totalCount++;            helper.insert(MongoDbHelper.UDPCollection, udpCapPacket);            if (captureListener != null) {                captureListener.capture(udpCapPacket, "UDP", totalCount, c);            }        }    }    public void setCaptureListener(CaptureListener captureListener) {        this.captureListener = captureListener;    }    public void removeListener() {        // TODO Auto-generated method stub        captureListener = null;    }    interface CaptureListener {        void capture(Object obj, String tpye, int totalNum, int curNum);    }}

以及三个封装包类和数据库连接类,这里就不贴代码了

更多相关文章

  1. Android(安卓)中文API (91) —— GestureDetector
  2. Android(安卓)HandlerThread分析
  3. Android自动化测试Espresso+UIAutomator故障总结
  4. Android(安卓)拦截Home键的常用方法
  5. Android串口开发
  6. Android(安卓)中监听WIFI连接状态变化
  7. Android(安卓)Surface 4 SurfaceFlinger
  8. IPCThreadState 详解
  9. 网络请求工具类WebServiceUtils

随机推荐

  1. Android(安卓)SQLiteOpenHelper的使用
  2. Android(安卓)webView中调用JavaScript
  3. android中的Handler
  4. android画日历
  5. Android获取GPS坐标:
  6. 高德地图Android,绘制自定义定位蓝点、mar
  7. scrollView的fillviewport
  8. Dialog的样式
  9. Android实现圆角照片和圆形照片
  10. android获取NetworkMode