在Java中用Jpcap捕获网络包

如果你想捕获Java程序中的网络包,那么你需要一些辅助工具,因为核心Java API不能访问底层的网络数据。但Jpcap是一种提供在Windows或UNIX系统上进行这种访问的Java API。

Jpcap不是一种纯粹的Java解决方案;它依赖本地库的使用。在Windows 或 UNIX上,你必须有必要的第三方库,分别是WinPcap或libpcap。


你需要告诉Jpcap你想用哪个网络设备来监听

NetworkInterface[]  devices = JpcapCaptor.getDeviceList(); 
         
NetworkInterface  device = devices[1];
选择一个设备之后,通过JpcapCaptor.openDevice()方法打开它。openDevice()方法需要四个参数:即将打开的设备名,从设备上一次读取的最大字节数,说明是否将设备设为混杂模式的Boolean值,和以后调用processPacket()方法要使用到的超时值。
JpcapCaptor  jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000);  


jpcap.setFilter("udp",true);
openDevice()方法将一个参数返回到用以捕获的Jpcap对象。既然有了Jpcap实例,你可以调用processPacket() 或loopPacket()开始监听了。这两种方式都带有两个参数:捕获的最大包数可以是-1(说明没有限制);执行JpcapHandler的一个类的实例。

jpcap.processPacket(5, new PacketReceiver(){


@Override
public void receivePacket(Packet pkg) {

System.out.println(pkg.toString());
}
}

 

如果你调用processPacket(),那么Jpcap将一直捕获包,直到超过openDevice中规定的时限或达到了规定的最大包数。

loopPacket()则将一直捕获包,直到达到最大包数,如果没有最大数限制,它将永远运行下去。就像下面这样调用:

jpcap.loopPacket(-1, new PacketReceiver(){



@Override
public void receivePacket(Packet pkg) {

System.out.println(pkg.toString());
}

}

你可能感兴趣的:(在Java中用Jpcap捕获网络包)