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

pang040328 2011-10-05 04:16:18
首先,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

我也不知道这些内容是从哪儿来的,请高手赐教
...全文
193 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyututu 2014-04-23
  • 打赏
  • 举报
回复
最近在做毕设, 用到jpcap抓包并显示到表格中,动态插入数据这块一直没实现,用这个办法还是没成功,有点茫然了。。。楼主给指教一下吧!!!

这块没太看懂,问题好像也出现在这,我把packets参数删掉了,不知道有什么影响。
xiaoyututu 2014-04-23
  • 打赏
  • 举报
回复
引用 11 楼 rui888 的回复:
我来看怎么解决了。
楼楼出现的好迅速!
xiaoyututu 2014-04-23
  • 打赏
  • 举报
回复
用这个方法没有将数据插入到表格中,控制台能看出来确实在抓包,感觉还是插入数据部分代码出了问题,不知道楼主还能看到这个帖子吗,如果看到想请教一下。
tony4geek 2014-04-23
  • 打赏
  • 举报
回复
我来看怎么解决了。
xiaoyututu 2014-04-23
  • 打赏
  • 举报
回复
请问问题代码该如何修改呢?
suciver 2013-12-03
  • 打赏
  • 举报
回复
因为楼主存到addRow存到表格中的数据都是PacketTableData的对象。而楼主取单元格方法

 public Object getValueAt(int row, int column) {
        // TODO 自动生成方法存根
        return  packetData.elementAt(row); 
    }
这里取的都是PacketTableData的对象。默认的就是包名.类名@内存地址。楼主应该是要单元格上每个cell显示的是PacketTableData对象里的对应的每个属性值才对
GTA终结者 2013-12-02
  • 打赏
  • 举报
回复
请问问题出在哪里?
完美灬缺陷 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pang040328 的回复:]
引用 5 楼 huangchenliang 的回复:
顶下。都解决了还要说什么、

看看把分都加给谁啊
[/Quote]
才发现、这么多米...
pang040328 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huangchenliang 的回复:]
顶下。都解决了还要说什么、
[/Quote]

看看把分都加给谁啊
完美灬缺陷 2011-10-05
  • 打赏
  • 举报
回复
顶下。都解决了还要说什么、
pang040328 2011-10-05
  • 打赏
  • 举报
回复
这个问题我已经解决了,哪位朋友提交的答案最全面,我将200分全部奉上,目前为止,huntor同志给的答案最全面。
pang040328 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huntor 的回复:]
Java code

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

这个方法不对吧?
[/Quote]

恩恩,这是其中一个原因
huntor 2011-10-05
  • 打赏
  • 举报
回复

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

这个方法不对吧?
pang040328 2011-10-05
  • 打赏
  • 举报
回复
大侠安在?解救小弟啊

50,543

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧