当前位置:编程学习 > JAVA >>

关于利用JPcap抓包动态向JTable添加行数据的问题

首先,PacketTableData封装的是JTable表中每行的数据属性,包含的属性如下

private int ID;//数据包序号
private String protocol;//数据包协议
private String src_ip;//源地址
private String des_ip;//目标地址
private Date sendTime;//数据包发送时间
private String sendTimeString;// 
private int packetSize;//包大小
private String src_MAC;//源MAC地址
private String des_MAC;//目标MAC地址

其次是自己写的PacketTableModel,该类继承AbstractTableModel,该类的具体代码如下所示:

public class PacketTableModel extends AbstractTableModel {
private PacketTableData tableData;// 用于存储数据包列表中的一行数据
static int i = 0;
protected Vector<PacketTableData> packetData;
 String[] columnNames = { new String("NO"),
new String("协议"), new String("源地址"), new String("目的地址"),
new String("发送时间"), new String("包大小"), new String("源MAC地址"),
new String("目标MAC地址") };
 
 public PacketTableModel(){
 this.tableData = new PacketTableData();
 packetData = new Vector<PacketTableData>();
 } 
public PacketTableData getTableData() {
return tableData;
}

public void setTableData(PacketTableData tableData) {
this.tableData = tableData;
}

// 处理数据包,并初始化tableData
public void processPacket(Packet packet) {

System.out.println("rowsize: "+rowsize);
int id = i++;
//设置ID
tableData.setID(id);
// 包大小
tableData.setPacketSize(packet.len);
//设置时间
Date curDate = new Date(System.currentTimeMillis());
tableData.setSendTime(curDate);
//获取MAC地址
EthernetPacket  ePacket = (EthernetPacket)packet.datalink;
String src_mac = ePacket.src_mac.toString();
String des_mac = ePacket.dst_mac.toString();
tableData.setSrc_MAC(src_mac);
tableData.setDes_MAC(des_mac);
 //分析ARP协议
if(packet instanceof ARPPacket){   
//设置协议
tableData.setProtocol("ARP");
ARPPacket aPacket = (ARPPacket)packet;
//初始化IP
String src_ip = aPacket.getSenderProtocolAddress().toString();
String des_ip = aPacket.getTargetProtocolAddress().toString();
tableData.setSrc_ip(src_ip);
tableData.setDes_ip(des_ip);
}
 //分析ICMP协议
if(packet instanceof ICMPPacket){         
ICMPPacket iPacket = (ICMPPacket)packet;
//设置协议
tableData.setProtocol("ICMP");
//初始化IP
String src_ip = iPacket.src_ip.toString();
String des_ip = iPacket.dst_ip.toString();
tableData.setSrc_ip(src_ip);
tableData.setDes_ip(des_ip);
}
//分析IP
if(packet instanceof IPPacket){        
IPPacket iPacket = (IPPacket)packet;
String src_ip = iPacket.src_ip.toString();
String des_ip = iPacket.dst_ip.toString();
tableData.setSrc_ip(src_ip);
tableData.setDes_ip(des_ip);
//UDP
if(iPacket instanceof UDPPacket){      
//设置协议信息
tableData.setProtocol("UDP");
}
if(iPacket instanceof TCPPacket){ 
//设置协议信息
tableData.setProtocol("TCP");
}
}

}

// 往数据包列表中添加一行数据
//int  row = 0;
public void addRow(PacketTableData tableData,Vector<Packet> packets) {
//packets参数是之前另作他用的
packetData.addElement(tableData);
 fireTableDataChanged();   

}

public int getColumnCount() {
// TODO 自动生成方法存根
return columnNames.length;
}

public int getRowCount() {
// TODO 自动生成方法存根
return packetData.size();
}

public Object getValueAt(int row, int column) {
// TODO 自动生成方法存根
return  packetData.elementAt(row); 
}
public String getColumnName(int column){
if(column==0) return "No.";

return columnNames[column];
}
 //单元不可编辑
  public boolean isCellEditable(int row, int column) {
    return false;
  }
}


然后我在Sniffer主类中创建了一个表格,代码如下:

PacketTableModel tableModel = new PacketTableModel();
 
packetTable = new JTable(tableModel);

 packetTable.setPreferredScrollableViewportSize(new Dimension(500, 70));    
 packetTable.setFillsViewportHeight(true); 
 
 JScrollPane scrollPane = new JScrollPane(packetTable);   
 JPanel panel = new JPanel();
panel.add(scrollPane);  
scrollPane.setPreferredSize(new java.awt.Dimension(1081, 208));
panel.setOpaque(true);
jPanel3.add(panel, BorderLayout.CENTER);

然后这是开始抓包时jpcap.processPacket(1, handler);进行的方法调用

private PacketReceiver handler=new PacketReceiver(){
public void receivePacket(final Packet packet) {
packets.add(packet);

PacketTableModel tableModel = (PacketTableModel)packetTable.getModel();
tableModel.processPacket(packet);
//获取tableData
PacketTableData tableData = tableModel.getTableData();
//插入数据包列表
tableModel.addRow(tableData,packets);

}
};


现在程序运行情况为:当我点击开始按钮时,程序开始调用多线程进行抓包,并将相应的包数据显示在表格中,表格按理说是不断地插入新行并显示相应内容的。但是现在不断插入表格的数据都是:
test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869 test.PacketTableData@1a16869

我也不知道这些内容是从哪儿来的,请高手赐教 --------------------编程问答-------------------- 大侠安在?解救小弟啊 --------------------编程问答--------------------

    public Object getValueAt(int row, int column) {
        // TODO 自动生成方法存根
        return  packetData.elementAt(row); 
    }

这个方法不对吧? --------------------编程问答--------------------
引用 2 楼 huntor 的回复:
Java code

    public Object getValueAt(int row, int column) {
        // TODO 自动生成方法存根
        return  packetData.elementAt(row); 
    }

这个方法不对吧?


恩恩,这是其中一个原因 --------------------编程问答-------------------- 这个问题我已经解决了,哪位朋友提交的答案最全面,我将200分全部奉上,目前为止,huntor同志给的答案最全面。 --------------------编程问答-------------------- 顶下。都解决了还要说什么、 --------------------编程问答--------------------
引用 5 楼 huangchenliang 的回复:
顶下。都解决了还要说什么、


看看把分都加给谁啊 --------------------编程问答--------------------
引用 6 楼 pang040328 的回复:
引用 5 楼 huangchenliang 的回复:
顶下。都解决了还要说什么、

看看把分都加给谁啊

 才发现、这么多米...  --------------------编程问答-------------------- 请问问题出在哪里? --------------------编程问答-------------------- 因为楼主存到addRow存到表格中的数据都是PacketTableData的对象。而楼主取单元格方法

 public Object getValueAt(int row, int column) {
        // TODO 自动生成方法存根
        return  packetData.elementAt(row); 
    }

这里取的都是PacketTableData的对象。默认的就是包名.类名@内存地址。楼主应该是要单元格上每个cell显示的是PacketTableData对象里的对应的每个属性值才对
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,