2011-06-18 6 views
1

jpcapを使用して帯域幅利用率監視ツールを開発しています。 私は何をしていますか: -
1.システム上に存在するすべてのネットワークインターフェイスの一覧を含むラジオボタンパネルを作成しました。ユーザーはその中の1つを選択する必要があります。
2.ユーザーがGOをクリックしたときの帯域幅使用率のリアルタイムグラフを表示するjfreechartパネル(動的)ボタン。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(デバイス[selecteddevice]、65535、true、20)をコメントアウトしたとき。 それから私がGOを押すと!ボタンを押すと、すべてが機能します。たとえば、タイマーが開始され、チャートパネルが更新されています(キャプチャがnullのため、データをキャプチャしていないので)。
私を助けてください!
私のシステムは、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

あなたの素早い応答のためにありがとうございました、私はスイングアプリケーションの開発の初心者です親切に私をもう少しガイド.. – Deepak

+0

私の質問は: - 私はswingWorkerにjpcapCaptor.openDeviceを置く必要がありますか?私はいつjpcapCaptor.openDeviceアプリケーションを正常に動作初期化しないように。 – Deepak

+1

@Deepak: "jpcapCaptor.openDeviceをswingWorkerに置くべきですか?" swingWorkerがSwingWorkerを意味するなら、yesを返します。 –

関連する問題