实战:使用JpcapCaptor实例来捕捉网络数据包(一)


当你通过打开网卡设备得到JpcapCaptor实例后,就可以利用它来捕捉网络数据包了。接下来我们使用回调函数机制进行数据包的获取:

      首先,你要自定义一个类,该类必顺实现PacketReceiver接口,(在事件处理机制雷同)。PacketReciver接口只声名了receivePacket(Packet packet) 方法,所以你要在你定义的类中实现该方法,方法体里写处理接收到的数据包的代码,得到的数据包为型参packet.

     接着,你就可以通过调用JpcapCaptor类的实例的processPacket()或loopPacket()来开始接收数据包。开始接收数据包后,当接收到数据包时就会回调实现PacketReceiver接口的类的receivePacket的方法,使理接收到的数据包。

     public int processPacket(int n , PacketRecevier handler);

     参数1  类型   int                           解释:一次接收包的个数(个数到时到产生回调)

     参数2  类型   PacketRecevier   解释:(回调者)事件临听者

     返回值:捕捉到的数据包的个数

     功能:捕捉自定义个数的网络数据包。与loopPacket()方法不同,当接收超时(这个由前面的openDevice()方法的最后一个接收超时参数所决定)该方法立即返回。同样的在非阻塞模式下是,没有数据所可接收,该方法也立即返回。

     public int loopPacket(int n, PacketRecevier handler):

     参数1  类型   int                        解释:一次接收包的个数(个数到时到产生回调)

    如下为一个简单的demo:

 /**
      * @(#)GetPacketDemo.java
     *
     * 演示利用回调机制来捕捉网络数据包
     * @author scholar_ii
     * @version 1.00 2007/12/17     */
import jpcap.*;
import jpcap.packet.*;
public class GetPacketDemo 
{
    public static void main(String [] args) throws Exception 
    {
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        int index = 0;
        if(devices.length>1)/*去掉虚拟网卡的处理*/
          index =  1;
         JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20);
         captor.loopPacket(-1, new Receiver()); 
    }
}
class Receiver implements  PacketReceiver
{   
    /*实例receivePacket方法*/
   public void receivePacket(Packet packet)
   {
      /*进行简单的处理*/
     System.out.println(packet);
   }
}

    参数2  类型   PacketRecevier   解释:(回调者)事件临听者

    返回值:捕捉到的数据包的个数

    功能:捉自定义个数的网络数据包。与processPacket()方法不同,该方法忽视超时,不支持工作在非阻塞模式。

    注意:在这两个方法的第一个参数中,你可以设定其值为-1。这时你可以停的捕捉数据包,直到捕捉结束,或错误发生为止



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要捕获网络上的相关数据包并打印每个数据包的16进制,可以使用Java中的一些网络编程库,如Jpcap或JNetPcap。 首先,我们需要在Java项目中添加所选库的依赖。然后,可以使用库提供的API来实现捕获和打印数据包的功能。 以下是一个使用Jpcap库的示例代码: ```java import jpcap.JpcapCaptor; import jpcap.PacketReceiver; import jpcap.packet.Packet; public class PacketCapture { public static void main(String[] args) { try { // 打开网络设备进行数据包捕获(可以选择具体的设备或通过索引来选择) JpcapCaptor captor = JpcapCaptor.openDevice(); // 创建一个PacketReceiver对象,用于处理捕获到的数据包 PacketReceiver receiver = new PacketReceiver() { @Override public void receivePacket(Packet packet) { // 将数据包转换为16进制字符串并打印 String hexString = bytesToHexString(packet.data); System.out.println(hexString); } }; // 开始捕获数据包,设置捕获的最大数量为-1(表示无限制) captor.loopPacket(-1, receiver); } catch (Exception e) { e.printStackTrace(); } } // 将字节数组转换为16进制字符串 private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X", b)); } return sb.toString(); } } ``` 以上代码使用了Jpcap库的`JpcapCaptor`类来打开网络设备,并使用`PacketReceiver`接口来定义数据包的处理方法。在`receivePacket`方法中,我们将捕获到的数据包转换为16进制字符串并打印出来。 请注意,捕获网络数据包需要使用管理员权限运行程序,并且需要允许程序访问网络接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值