захват пакетов из сети и сохранение в базе данных с помощью библиотеки jpcap

Я перехватываю пакеты с помощью библиотеки jpcap и сохраняю в базе данных Mysql. Я хочу сделать эти две функции отдельно. Моя программа захватывает пакет и сохраняет в базе данных, затем захватывает другой пакет и сохраняет в базе данных. Я хочу, чтобы один метод перехватывал пакеты, а другой метод сохранял их в базе данных. Сохранение пакета не останавливает захват для завершения процесса.

    public class PacketSniffer {
    private static String[] devices;
    private static PacketCapture captor;
    private static Packet info;            
    private static final Scanner input = new Scanner(System.in);
    private static final String FILTER = "";
    private static final int PACKET_COUNT = -1;

    public PacketSniffer()
    {
       captor = new PacketCapture();
       int i;
       devices =  PacketCapture.lookupDevices();

       for(i=0; i<devices.length; i++)
       {
          System.out.println(i+": "+devices[i]); // +devices[i].name
          System.out.println();
       }
       String device = input.nextLine();
       captor.open(device, 65535, true, 0);
       captor.setFilter(FILTER, true);
       captor.addPacketListener(new PacketCapture());
       captor.capture(PACKET_COUNT);             
    }
}

Обработчик пакетов для обработки перехваченных пакетов:

    public class PacketHandler implements PacketListener {

    Queue<Packet> queue;

    @Override
    public void packetArrived(Packet packet) 
    {
       System.out.println(packet);
    } 

    public void savePacket()
    {
       //  Method to save packet in database 
    }
}

person Community    schedule 27.04.2014    source источник
comment
Думали ли вы о том, какие столбцы будут в таблице базы данных, где вы их будете хранить?   -  person Dawood ibn Kareem    schedule 27.04.2014
comment
В чем здесь собственно вопрос?   -  person user207421    schedule 27.04.2014
comment
как запустить метод savePacket() и метод packageArrived() одновременно   -  person    schedule 28.04.2014
comment
да сэр да сэр моя база данных готова, я хочу повысить эффективность, не выполняя процедуру сохранения данных в методе packetArrived   -  person    schedule 28.04.2014
comment
Вы можете поместить захваченные пакеты в очередь и прочитать метод базы данных из очереди. Но что произойдет, если очередь переполнится? Ответ на ваш вопрос, кажется, в основном «потоки», но вы наверняка знали об этом?   -  person user207421    schedule 28.04.2014
comment
Спасибо за это, у меня такая же идея, но как я могу реализовать потоки в одном классе, содержащем два метода   -  person    schedule 28.04.2014
comment
С двумя анонимными Runnables, но почему это должен быть один класс с двумя методами?   -  person user207421    schedule 28.04.2014
comment
Я реализую два потока, запускающих два разных класса. поток 1 запускает класс анализатора, а поток 2 запускает класс сохранения данных.   -  person    schedule 28.04.2014
comment
Как реализовать анонимные Runnables?   -  person    schedule 28.04.2014
comment
Зачем тебе две темы здесь? Мне кажется, что два потока будут тратить много времени на ожидание друг друга, и вы не получите от них никакой выгоды. Для максимальной эффективности я бы предложил запускать все это в одном потоке.   -  person Dawood ibn Kareem    schedule 28.04.2014
comment
Я хочу выполнять захват и сохранение в двух разных потоках, потому что, если я выполняю захват и сохранение в одном потоке, это займет больше времени и потеряет половину пакетов. Я не хочу терять пакеты. Я хочу запускать метод сохранения одновременно с захватом, не прерывая механизм захвата для захвата всех пакетов.   -  person    schedule 28.04.2014
comment
Вы не ответили на мой вопрос. Мы все согласны, что вам нужно два потока. Почему это должен быть класс конуса с двумя методами? И если это так, в чем проблема с вызовом этих двух методов из отдельных потоков?   -  person user207421    schedule 28.04.2014
comment
@EJP Я хочу запустить 2 метода в два потока, потому что я не могу прервать метод packetArrived, этот метод определяется API, я не хочу усложнять этот метод, поэтому я хочу сохранять пакеты другим методом, но я хочу значение его метода для использования в другом методе. Как это сделать?   -  person    schedule 28.04.2014
comment
@EJP Я полагаю, что Алия отвечала на мой вопрос, а не на твой.   -  person Dawood ibn Kareem    schedule 28.04.2014
comment
@DavidWallace Вот что я сказал. Он не ответил на мой вопрос.   -  person user207421    schedule 28.04.2014
comment
@EJP Я не понял твоего вопроса?   -  person    schedule 28.04.2014


Ответы (3)


public class PacketCapture implements PacketListener,Runnable {
Queue<Packet> queue = new LinkedList<>();
@Override
public void packetArrived(Packet packet) 
{
   queue.add(packet);
   System.out.println(m_counter++);
}

public void run()
{
  while(!(queue.equals(null))){
    System.out.println(queue.poll());
 }
 }
 }

В основном методе

 public static void main(String[] args) {

     Thread t1 = new Thread(new PacketSniffer());
    Thread t2 = new Thread(new PacketCapture());
     t1.start();
    t2.start();
}
person Community    schedule 28.04.2014
comment
Я думаю, вам понадобится какой-то цикл в вашем методе run, иначе вы получите только один пакет из очереди. - person Dawood ibn Kareem; 28.04.2014
comment
я получаю NUll, не получая даже 1 значение - person ; 28.04.2014
comment
Верно. Я предполагаю, что ваш run происходит до того, как что-либо будет добавлено в очередь. Вы можете использовать BlockingQueue, поэтому вы можете использовать метод take. Но вам все равно понадобится петля. - person Dawood ibn Kareem; 28.04.2014
comment
Взгляните на LinkedBlockingQueue — это может быть то, что вы хотите. - person Dawood ibn Kareem; 28.04.2014
comment
это никогда не дает мне значения в функции запуска, что бы я ни делал. я передаю нулевое исключение циклом while - person ; 28.04.2014
comment
Ваш метод packetArrived вообще работает? - person Dawood ibn Kareem; 28.04.2014
comment
Итак, когда он запускается, в очереди по-прежнему ничего нет? - person Dawood ibn Kareem; 28.04.2014
comment
нет Если я отображаю очередь в методе packetArrived, он показывает результат, но в методе запуска он показывает нуль - person ; 28.04.2014
comment
Хорошо, прямо сейчас у вас есть бесконечный цикл, который будет просто продолжать писать null в консоль. Поэтому, если вы добавили несколько значений в очередь, они, вероятно, исчезнут из поля зрения. Почему бы вам не изменить его так, чтобы он печатался только в том случае, если опрашиваемое значение не равно нулю? На самом деле, я думаю, вам следует использовать LinkedBlockingQueue и использовать либо метод take, либо версию poll с тайм-аутом. - person Dawood ibn Kareem; 28.04.2014
comment
LinkedBlockingQueue также не работает. Не отображать никаких значений - person ; 29.04.2014

Теперь, в чем проблема с этим примером, он также не отображает значение в классе Runnable1.

 public class Test {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

 Thread t1 = new Thread(new Runnable1());
 t1.start();
  Thread t2 = new Thread(new RunnableDemo());
 t2.start();
}
}

 class RunnableDemo implements Runnable {
Queue queue = new LinkedList<>();
public void run() 
{
   queue.add(4);
    queue.add(8);
     queue.add(12);
   System.out.println("Running");
}

 }
 class Runnable1 implements Runnable {
public void run()
  {
    RunnableDemo RunnableDemo = new RunnableDemo();
    for(int i=0; i<=100; i++)
    {
    System.out.println(RunnableDemo.queue.poll());
    }

}
}

person Community    schedule 28.04.2014

Кроме того, здесь вы можете запустить два потока одновременно: один для захвата пакетов, а другой для хранения пакетов в базе данных. Вы можете использовать любую библиотеку обмена сообщениями, такую ​​как zeroMQ или rabbitMQ, для асинхронной отправки пакетов в поток базы данных, как только они будут получены, что автоматически обработает любую очередь. Таким образом, ваш захват пакетов не будет заблокирован, и вы сможете делать обе вещи одновременно. Единственным узким местом будет ваша скорость вставки в базу данных, которую можно улучшить, если вы используете nosql или mongodb.

person 4aRk Kn1gh7    schedule 13.06.2014