Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Jtable обновление таблицы 
:(
    Опции темы
6pblcb
Дата 12.4.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



Доброго времени суток. В среде NetBeans пытаюсь сделать подобие сниффера.

Вот есть такая модель таблицы:
Код

class DataModel extends AbstractTableModel {
    static ArrayList<Object[]> list = new ArrayList<Object[]>();
    private final String[] HEADERS =  {"№", "ПРотокол", "IP отправителя", "Порт отправителя", "IP получателя", "Порт получателя"};
    private final int COLS = 6;
    private int rows = 0;
    static DataModel rr1 = new DataModel();
    //JTable table;
    //static DataModel dataModel = new DataModel();
    //JTable table = new JTable(dataModel);

    public String getColumnName(int col) {
        return HEADERS[col];
    }
    public int getRowCount() {
        return rows;
    }
    public int getColumnCount() {
        return COLS;
    }
    public Object getValueAt(int row, int col) {
        return list.get(row)[col];
    }
    public void setValueAt(Object val, int row, int col) {
        list.get(row)[col] = val.toString();
        fireTableDataChanged(); //обновление таблицы после изменений
    }
    public boolean isCellEditable(int row, int col) {
        return true;
    }
    public void addRow(int  nomer, String protocol, String srcip, String srcport, String dstip, String dstport) {
        list.add(new String[COLS]);
        setValueAt(nomer, rows, 0);
        setValueAt(protocol, rows, 1);
        setValueAt(srcip, rows, 2);
        setValueAt(srcport, rows, 3);
        setValueAt(dstip, rows, 4);
        setValueAt(dstport, rows, 5);
        rows++;
        //fireTableDataChanged();
    }
    public Class getColumnClass(int col) {
        switch (col) {
        case 0: return String.class;
        case 1: return String.class;
        case 2: return String.class;
        case 3: return String.class;
        case 4: return String.class;
        case 5: return String.class;
        }
        return null;
    }
}


По нажатию на кнопку, мы получаем список сетевых интерфейсов, открываем нужный, принимаем 505 пакетов, попутно пишем лог, и пытаемся вывести данные в таблицу.
Код

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt)  {                                         
        // TODO add your handling code here:
        jTable1.setModel(DataModel.rr1);
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        int temp = ((Integer)jSpinner1.getValue());
        System.out.println(temp);
        try {
        JpcapCaptor captor=JpcapCaptor.openDevice(devices[temp], -1, false, 0);
        FileWriter fw = new FileWriter("ty.txt");
        fw.write("Protocol\tsrc_ip\t\t\t\tport\t\tdst_ip\t\t\t\tport\n\n");
        fw.close();
        FileWriter fw1 = new FileWriter("levoe.txt");
        fw1.close();
        FileWriter fw2 = new FileWriter("levoe2.txt");
        fw2.close();
        String type1 = "jpcap.packet.UDPPacket";
        String type2 = "jpcap.packet.TCPPacket";
        String type3 = "jpcap.packet.ICMPPacket";
        //String ip = ((String) jList1.getSelectedValue());
        String ip = jTextField1.getText();
              
        for (int i=0; i<505; i++){

            Packet packet = captor.getPacket();
            Class cl=packet.getClass();
            System.out.println("класс  " +cl.getName());
            String type = cl.getName();
            System.out.println("класс  " +packet.getClass().getName());
            if (type.equals(type1)){
                //System.out.println("jpcap.packet.UDPPacket");
                UDPPacket uDPacket = (UDPPacket) packet;
                String ip1 = uDPacket.src_ip.toString();
                if (ip1.equals(ip) == false){
                    writeText.writeTextToFile("ty.txt", "UDP\t\t" +uDPacket.src_ip +"\t\t" +uDPacket.src_port  +"\t\t" +uDPacket.dst_ip +"\t\t" +uDPacket.dst_port +"\n");
                    DataModel.rr1.addRow(i, "UDP", uDPacket.src_ip.toString(), Integer.toString(uDPacket.src_port), uDPacket.dst_ip.toString(), Integer.toString(uDPacket.dst_port));
                    //jTable1.setModel(DataModel.rr1);
                    //jTable1.repaint();
                }
                else {
                    writeText.writeTextToFile("levoe2.txt", "UDP\t\t" +uDPacket.src_ip +"\t\t" +uDPacket.src_port +"\t\t" +uDPacket.dst_ip +"\t\t" +uDPacket.dst_port +"\n");
                    DataModel.rr1.addRow(i, "UDP", uDPacket.src_ip.toString(), Integer.toString(uDPacket.src_port), uDPacket.dst_ip.toString(), Integer.toString(uDPacket.dst_port));
                    //jTable1.setModel(DataModel.rr1);
                    //jTable1.repaint();
                }
            } else if (type.equals(type2)){
                System.out.println("jpcap.packet.TCPPacket");
                TCPPacket tCPPacket = (TCPPacket) packet;
                String ip1 = tCPPacket.src_ip.toString();
                if (ip1.equals(ip) == false){
                    writeText.writeTextToFile("ty.txt", "TCP \t\t" +tCPPacket.src_ip +"\t\t" +tCPPacket.src_port +"\t\t" +tCPPacket.dst_ip +"\t\t" +tCPPacket.dst_port +"\n");
                    DataModel.rr1.addRow(i, "TCP", tCPPacket.src_ip.toString(), Integer.toString(tCPPacket.src_port), tCPPacket.dst_ip.toString(), Integer.toString(tCPPacket.dst_port));
                }
                else {
                    writeText.writeTextToFile("levoe2.txt", "TCP \t\t" +tCPPacket.src_ip +"\t\t" +tCPPacket.src_port +"\t\t" +tCPPacket.dst_ip +"\t\t" +tCPPacket.dst_port +"\n");
                    DataModel.rr1.addRow(i, "TCP", tCPPacket.src_ip.toString(), Integer.toString(tCPPacket.src_port), tCPPacket.dst_ip.toString(), Integer.toString(tCPPacket.dst_port));
                }
            } else if (type.equals(type3)){
                System.out.println("jpcap.packet.ICMPPacket");
                ICMPPacket iCMPPacket = (ICMPPacket) packet;
                String ip1 = iCMPPacket.src_ip.toString();
                if (ip1.equals(ip) == false){
                    DataModel.rr1.addRow(i, "ICMP", iCMPPacket.src_ip.toString(), String.valueOf(iCMPPacket.type) , iCMPPacket.dst_ip.toString(), "");
                    writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +iCMPPacket.type  +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"\n");
                    if (0 == iCMPPacket.type){
                        writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"echo-reply" +"\n");
                    } else if (8 == iCMPPacket.type){
                        writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"echo" +"\n");
                    } else if (11 == iCMPPacket.type){
                        writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"ttl-exceeded" +"\n");
                    } else if (3 == iCMPPacket.type){
                        if (1 == iCMPPacket.code){
                            writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"host-unreachable" +"\n");
                        } else if (0 == iCMPPacket.code){
                            writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"net-unreachable" +"\n");
                        } else if (3 == iCMPPacket.code){
                            writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"port-unreachable" +"\n");
                        } else if (2 == iCMPPacket.code) {
                            writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"protocol-unreachable" +"\n");

                        } else {
                            writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"unreachable" +"\n");
                        }
                    } else {
                        writeText.writeTextToFile("ty.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +"\t\t" +iCMPPacket.dst_ip +"\t\t" +iCMPPacket.type +"\n");
                    }
                }
                else writeText.writeTextToFile("levoe.txt", "ICMP \t\t" +iCMPPacket.src_ip +"\t\t" +iCMPPacket.type  +"\t\t" +iCMPPacket.dst_ip +"\t\t" +"\n");
            } else {
                writeText.writeTextToFile("levoe.txt", cl.getName() +"\t\t" +packet.toString() +"\n");
                DataModel.rr1.addRow(i, "PACKET", "", "", "", "");
            }
            System.out.println(packet.toString() +"\n"+i);
        }
        captor.close();
        }
        catch(IOException ex)
        {
        // Обрабатываем ошибку
        }

    }


Но данные в таблице отобразятся только после завершения всего цикла, а надо что бы после каждого принятого пакета.
PM MAIL   Вверх
major32
Дата 22.6.2010, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.4.2010

Репутация: нет
Всего: нет



Запускай GUI в отдельном потоке.
PM MAIL   Вверх
Skipy
Дата 22.6.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Цитата(6pblcb @ 12.4.2010,  14:45)
Но данные в таблице отобразятся только после завершения всего цикла, а надо что бы после каждого принятого пакета.

Естественно. Отрисовка таблицы происходитв GUI-потоке. А Вы именно в нем грузите данные. Пока не выйдете из метода - ничего не отрисуется.

Запускайте загрузку в другом потоке и используйте SwingUtilities.invokeLater. Как это сделать - читайте тут: http://www.skipy.ru/technics/synchronization.html


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0723 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.