我使用JBuilder2006做了一个抓包然后回显的小程序,通过监听button的
事件触发:
     public void jButton1_mouseClicked(MouseEvent e) {
      try{
        jpcap=Jpcap.openDevice(Jpcap.getDeviceList()[1],1024,false,10000);
        jpcap.loopPacket(10,new GetPacket());
                                ----------
      }
      catch(java.io.IOException f){
        System.out.println("We can't open device");
      }
     }
  其中的 GetPacket()类为
import jpcap.*;
import java.util.Vector;
import javax.swing.JList;
/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
class GetPacket implements JpcapHandler{
  public void handlePacket(Packet packet){
    Frame.listMode1.addElement(packet);
  }
}
    /*listMode1是一个显示时的静态对象,用于向一个JList增加包的显示行,定义为                 public static DefaultListModel listMode1=new DefaultListModel();
 JList jList1 = new JList(listMode1);*/
使用jpcap.loopPacket(10,new GetPacket()),我想要的是一共抓十个包,抓到一个包显示一个,但我这里出现的情况是,抓到所有的包之后,才一起显示,这与Jpcap.loopPacket()的方法定义不符合,是什么原因造成的?请高手指教,3Q!

解决方案 »

  1.   

    你看看JPcap的API文档,API文档里面是这样写的
    public int loopPacket(int count,PacketReceiver handler)Captures the specified number of packets consecutively.consecutively的意思是连续的意思,我估计是一下子抓count个包吧,所以你在Frame.listMode1.addElement(packet);里面直接都add进去了,我是这样认为的,也不知道对不对
      

  2.   

    不要使用 jpacp.loopPacket(),使用 JpcapCaptor.getPacket(),这个方法是每次抓一个包,抓到包后就进行处理,用一个循环来处理,这样可以达到你的目的.
      

  3.   

    抓包线程阻塞了你的swing事件调度线程。
    加上多线程就可以了