2011-06-18 69 views
1

我正在開發一些使用jpcap的帶寬利用率監視工具。 我在做什麼: -
1.我創建了一個單選按鈕面板,其中包含系統中所有網絡接口的列表,用戶必須選擇其中一個。
2. jfreechart面板(動態),將顯示用戶點擊GO時帶寬利用率的實時圖表!按鈕。java Swing應用程序凍結時調用jpcapCaptor.openDevice方法

問題: -
我在GO中添加了以下ActionListener!按鈕

try{captor = JpcapCaptor.openDevice(devices[selecteddevice], 65535,true, 20);}catch(Exception e){} 
timer.start(); 
    captor.loopPacket(-1,new PacketPrinter()); 

因此,當我運行程序GUI自帶的單選按鈕面板,並jfreechart的面板,但是當我選擇一個選項,然後按GO!應用程序凍結並且圖表面板不顯示任何動態更新。


當我註釋掉JpcapCaptor.openDevice(devices [selecteddevice],65535,true,20); 然後當我按GO!按鈕,一切正常,例如定時器啓動和圖表面板正在更新(但由於捕捉器爲空,所以它不捕捉任何數據)
請幫助我!
我的系統是Ubuntu的10.04,JPCAP 0.7
我的代碼如下: -

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.Timer; 
import org.jfree.chart.ChartFrame; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.time.DynamicTimeSeriesCollection; 
import org.jfree.data.time.Second; 
import org.jfree.data.xy.XYDataset; 
import java.util.List; 
import java.util.ArrayList; 
import jpcap.*; 
import jpcap.packet.*; 
import java.util.*; 
import java.awt.event.*; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.swing.*; 

public class Sniffer extends JPanel 
{ 
    private static jpcap.NetworkInterface[] devices; 
    private static int selecteddevice=-1; 
    JFrame frame; 
    public static JpcapCaptor captor; 
    private static final String TITLE="Bandwidth Utilization Meter";; 
public static List<Packet> packets; 
public static Timer timer; 
    public static ArrayList<JRadioButton> radioButtonArray = new ArrayList<JRadioButton>(); 
private ButtonGroup group= new ButtonGroup(); 
    public static JButton go; 
    JFreeChart chart; 
    static DynamicTimeSeriesCollection dataset; 
    public Sniffer() 
    { 

     packets = new ArrayList<Packet>(); 
     dataset =new DynamicTimeSeriesCollection(1,120, new Second()); 
     dataset.setTimeBase(new Second(0, 0, 0, 2, 1, 2011)); 
     dataset.addSeries(new float[0], 0, "PPP0 Bandwidth Utilization Meter"); 
     chart = createChart(dataset); 
     getDevices(); 

     timer = new Timer(1000,new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 

      { long tlen=0; 
       List<Packet> temp = new ArrayList<Packet>(packets); 
       packets.clear(); 
       for(Packet i : temp) 
       { 
        tlen+=i.len; 
       } 
       float[] newData = new float[1]; 
       newData[0]=(float)tlen/1024; 
       dataset.advanceTime(); 
       dataset.appendData(newData); 
       }}); 
     setGUI(); 



    } 


    void setGUI() 
    { 
     setLayout(new BorderLayout()); 
     frame = new JFrame(); 
     JPanel panel = new JPanel(new GridLayout(devices.length, 1)); 
     for (JRadioButton combo : radioButtonArray) 
     { 
      panel.add(combo); 
     } 
     JScrollPane scrollPane = new JScrollPane(panel); 
     go= new JButton("GO!"); 
      go.addActionListener(new ActionListener() 
       { 
        public void actionPerformed(ActionEvent ee) 
        { 
    //problem starts here.............  
         try{captor = JpcapCaptor.openDevice(devices[selecteddevice], 65535,true, 20);}catch(Exception e){} 
         timer.start(); 
         captor.loopPacket(-1,new PacketPrinter()); 
    //..................................... 


        } 
      } 
      ); 

      go.setEnabled(false);  

      panel.add(go); 
      add(scrollPane, BorderLayout.CENTER); 
      scrollPane.setSize(300,300); 
      JFrame.setDefaultLookAndFeelDecorated(true); 
      frame.setLayout(new GridLayout(2, 0)); 
      frame.add(scrollPane); 
      frame.add(new ChartPanel(chart)); 
      frame.setSize(1024, 768); 
      frame.setTitle("BW"); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void getDevices() 
    { 
     devices = JpcapCaptor.getDeviceList(); 
     for(int i=0;i<devices.length;i++) 
     { 
      String device=null; 
      radioButtonArray.add(new JRadioButton()); 
      group.add(radioButtonArray.get(i)); 
      radioButtonArray.get(i).addActionListener(new RadioButtonListener()); 
      device= devices[i].name+" "+"("+devices[i].description+")"; 
      radioButtonArray.get(i).setText(device); 
      }  
    } 
    public static void startSniffing() throws Exception 
    { 
     captor = JpcapCaptor.openDevice(devices[selecteddevice], 65535,true, 20); 
    } 
    public static void setSelectedDevice(int device) 
    { 
     selecteddevice = device; 
    } 

    public NetworkInterface getSelectedDevice() 
    { 
     if (selecteddevice == -1) 
     { 
      return null; 
     } 
     else 
     { 
      return devices[selecteddevice]; 
     } 
    } 
    public static void main(String args[]) 
    { 
     Sniffer sniffer = new Sniffer(); 
     //sniffer.start(); 

    } 
    private JFreeChart createChart(final XYDataset dataset) { 
    final JFreeChart xyz = ChartFactory.createTimeSeriesChart(
     TITLE, "Time(Seconds)", "Bandwidth KB/s", dataset, true, true, false); 
    final XYPlot plot = xyz.getXYPlot(); 
    ValueAxis domain = plot.getDomainAxis(); 
    domain.setAutoRange(true); 
    ValueAxis range = plot.getRangeAxis(); 
    range.setRange(0,1000); 
    return xyz; 
} 
} 
class RadioButtonListener extends JPanel implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Sniffer.go.setEnabled(true); 

     for (JRadioButton radio : Sniffer.radioButtonArray) { 
      if (radio.isSelected()) { 

       Sniffer.setSelectedDevice(Sniffer.radioButtonArray.indexOf(radio)); 

      } 
     } 
    } 
} 


class PacketPrinter implements PacketReceiver { 
static long tlen; 
public void receivePacket(Packet packet) { 
    Sniffer.packets.add(packet); 
    } 
} 
+0

+1爲了添加代碼和描述問題,以至於我可以在不運行該代碼的情況下猜測解決方案。 ;) –

+0

@Andrew謝謝你:) – Deepak

回答

2

不要阻塞EDT。把耗時的任務放在SwingWorker

+0

謝謝你的快速反應,我是一個初學者在開發Swings應用程序,請多指導我多一點.. – Deepak

+0

我的問題是: - 我應該把jpcapCaptor.openDevice放在swingWorker中嗎?因爲當我不初始化jpcapCaptor.openDevice應用程序工作正常。 – Deepak

+1

@Deepak:「我應該把jpcapCaptor.openDevice放在swingWorker中嗎?」如果swing工作者是指SwingWorker,那麼是的。 –