簡體   English   中英

如何將jpcap數據包捕獲的數據顯示到JTable?

[英]How to display jpcap packet captued data to JTable?

如何將數據顯示到Jtable。 我有以下代碼將jpcap數據包捕獲的數據顯示到JTable。 但這沒有用。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import net.sourceforge.jpcap.capture.PacketCapture;
import net.sourceforge.jpcap.capture.PacketListener;
import net.sourceforge.jpcap.net.ARPPacket;
import net.sourceforge.jpcap.net.ICMPPacket;
import net.sourceforge.jpcap.net.IPPacket;
import net.sourceforge.jpcap.net.Packet;
import net.sourceforge.jpcap.net.TCPPacket;
import net.sourceforge.jpcap.net.UDPPacket;

public class NetworkStatistics implements PacketListener{

public JFrame frmNmcidsNetworkStatistics;
private Vector<String> row;
    private Vector<Vector> rowData;
    private Vector<String> columnNames;
    private DefaultTableModel DFMO;
    private JTable table;
    private JScrollPane scrollPane;
    private PacketCapture captureobj;
private String filter = "";
private int totalpackets = -1;

private static int counter = 0;

/*
 * Create the application.
*/
public NetworkStatistics() {
    initialize();
}

/*
 * Initialize the contents of the frame.
*/
private void initialize() {
    frmNmcidsNetworkStatistics = new JFrame();
    frmNmcidsNetworkStatistics.setTitle("NMCIDS: Network Statistics");
    frmNmcidsNetworkStatistics.setBounds(100, 100, 450, 300);
    frmNmcidsNetworkStatistics.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    row = new Vector<String>();
        rowData = new Vector<Vector>();

        columnNames = new Vector<String>();
        columnNames.addElement("Sr. No");
        columnNames.addElement("Source IP");
        columnNames.addElement("Source MAC");
        columnNames.addElement("Destination IP");
        columnNames.addElement("Destination MAC");
        columnNames.addElement("Protocol");

        DFMO = new DefaultTableModel(rowData, columnNames);
        table = new JTable(DFMO);
        scrollPane = new JScrollPane(table);
        frmNmcidsNetworkStatistics.getContentPane().add(scrollPane, BorderLayout.NORTH);

}

public void GetNetworkPackets(String capdev){
    try{
        captureobj = new PacketCapture();
        captureobj.open(capdev, true);
        captureobj.setFilter(filter, true);
        captureobj.addPacketListener(this);
        captureobj.capture(totalpackets);
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

public void dispalyPacketsTable(int srno, String sip, String smac, String dip, String dmac, String proto){
    row.addElement(""+srno);
        row.addElement(sip);
        row.addElement(smac);
        row.addElement(dip);
        row.addElement(dmac);
        row.addElement(proto);
        rowData.addElement(row);
        DFMO.fireTableDataChanged();
}

@Override
public void packetArrived(Packet pdata) {
     counter++;
     printdata(pdata);
}

public void printdata(Packet pdata){
    if(pdata instanceof TCPPacket){
            TCPPacket TCPO = (TCPPacket) pdata;
            dispalyPacketsTable(counter, TCPO.getSourceAddress(), TCPO.getSourceHwAddress(), TCPO.getDestinationAddress(), TCPO.getDestinationHwAddress(), "TCP");
        }
}
}

當我運行此代碼時,程序掛起。 但是,當我想顯示數據包捕獲的數據以命令promt時,它會正確顯示。 請幫助我。 先感謝您。

運行此代碼時程序掛起

可能是因為您的代碼在Event Dispatch Thread(EDT)上運行,這阻止了GUI響應事件。

您的數據包偵聽器需要在單獨的線程上運行,因此您不會阻止EDT。 閱讀Swing教程中有關Swing中的並發性的部分。 我猜您應該使用SwingWorker並且可以在結果可用時publishpublish

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM