2011-06-18 79 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,那么是的。 –