jpcap是第三方的开发包,主要是利用java对底层数据包进行捕获的,调用wipcap或者lipcap。官方网站提供了一个例子程序jpcapdumper,很好的一个程序,实现了网络数据包的捕获分析。
对于里面的ui设计,我是初学,说实在话,看不懂。如果哪位高手有空,有兴趣给帮忙看下啊,万分感谢。想问的就是这个程序的ui设计用到了哪些技术,如果我不使用程序的树形目录功能,单纯的添加按钮,不考虑以后的扩展性,如模块的添加什么的,是不是可以变的简单。还有程序调试的时候开始的界面上面的表格只有NO LENGTH等信息,怎末样才能把这些信息换掉,换成基本的source ip,port等信息,程序中所有的包信息都是通过左下表格点选显示。这样比较简单,哪位高手有空的话帮忙看下。有的分不多,希望有热心的人给指导下。
对于里面的ui设计,我是初学,说实在话,看不懂。如果哪位高手有空,有兴趣给帮忙看下啊,万分感谢。想问的就是这个程序的ui设计用到了哪些技术,如果我不使用程序的树形目录功能,单纯的添加按钮,不考虑以后的扩展性,如模块的添加什么的,是不是可以变的简单。还有程序调试的时候开始的界面上面的表格只有NO LENGTH等信息,怎末样才能把这些信息换掉,换成基本的source ip,port等信息,程序中所有的包信息都是通过左下表格点选显示。这样比较简单,哪位高手有空的话帮忙看下。有的分不多,希望有热心的人给指导下。
* Created on Apr 4, 2003
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package jdumper;import java.io.File;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.swing.JFileChooser;
import javax.swing.JOptionPane;import jdumper.stat.JDStatisticsTaker;
import jdumper.ui.JDCaptureDialog;
import jdumper.ui.JDContinuousStatFrame;
import jdumper.ui.JDCumlativeStatFrame;
import jdumper.ui.JDFrame;
import jdumper.ui.JDStatFrame;import jpcap.JpcapCaptor;
import jpcap.PacketReceiver;
import jpcap.JpcapWriter;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;/**
* @author kfujii
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class JDCaptor {
long MAX_PACKETS_HOLD=10000; List<Packet> packets = new ArrayList<Packet>(); JpcapCaptor jpcap=null; boolean isLiveCapture;
boolean isSaved = false; JDFrame frame; public void setJDFrame(JDFrame frame){
this.frame=frame;
} public List<Packet> getPackets(){
return packets;
}
public void capturePacketsFromDevice() {
if(jpcap!=null)
jpcap.close();
jpcap = JDCaptureDialog.getJpcap(frame);
clear();
if (jpcap != null) {
isLiveCapture = true;
frame.disableCapture(); startCaptureThread();
}
} public void loadPacketsFromFile() {
isLiveCapture = false;
clear(); int ret = JpcapDumper.chooser.showOpenDialog(frame);
if (ret == JFileChooser.APPROVE_OPTION) {
String path = JpcapDumper.chooser.getSelectedFile().getPath(); try {
if(jpcap!=null){
jpcap.close();
}
jpcap = JpcapCaptor.openFile(path);
} catch (java.io.IOException e) {
JOptionPane.showMessageDialog(
frame,
"Can't open file: " + path);
e.printStackTrace();
return;
} frame.disableCapture(); startCaptureThread();
}
} private void clear(){
packets.clear();
frame.clear(); for(int i=0;i<sframes.size();i++)
((JDStatFrame)sframes.get(i)).clear();
} public void saveToFile() {
if (packets == null)
return; int ret = JpcapDumper.chooser.showSaveDialog(frame);
if (ret == JFileChooser.APPROVE_OPTION) {
File file = JpcapDumper.chooser.getSelectedFile(); if (file.exists()) {
if (JOptionPane
.showConfirmDialog(
frame,
"Overwrite " + file.getName() + "?",
"Overwrite?",
JOptionPane.YES_NO_OPTION)
== JOptionPane.NO_OPTION) {
return;
}
} try {
//System.out.println("link:"+info.linktype);
//System.out.println(lastJpcap);
JpcapWriter writer = JpcapWriter.openDumpFile(jpcap,file.getPath()); for (Packet p:packets) {
writer.writePacket(p);
} writer.close();
isSaved = true;
//JOptionPane.showMessageDialog(frame,file+" was saved correctly.");
} catch (java.io.IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(
frame,
"Can't save file: " + file.getPath());
}
}
} public void stopCapture() {
stopCaptureThread();
} public void saveIfNot() {
if (isLiveCapture && !isSaved) {
int ret =
JOptionPane.showConfirmDialog(
null,
"Save this data?",
"Save this data?",
JOptionPane.YES_NO_OPTION);
if (ret == JOptionPane.YES_OPTION)
saveToFile();
}
} List<JDStatFrame> sframes=new ArrayList<JDStatFrame>();
public void addCumulativeStatFrame(JDStatisticsTaker taker) {
sframes.add(JDCumlativeStatFrame.openWindow(packets,taker.newInstance()));
} public void addContinuousStatFrame(JDStatisticsTaker taker) {
sframes.add(JDContinuousStatFrame.openWindow(packets,taker.newInstance()));
} public void closeAllWindows(){
for(int i=0;i<sframes.size();i++)
((JDStatFrame)sframes.get(i)).dispose();
} private Thread captureThread; private void startCaptureThread() {
if (captureThread != null)
return; captureThread = new Thread(new Runnable(){
//body of capture thread
public void run() {
while (captureThread != null) {
if (jpcap.processPacket(1, handler) == 0 && !isLiveCapture)
stopCaptureThread();
Thread.yield();
} jpcap.breakLoop();
//jpcap = null;
frame.enableCapture();
}
});
captureThread.setPriority(Thread.MIN_PRIORITY);
frame.startUpdating();
for(int i=0;i<sframes.size();i++){
((JDStatFrame)sframes.get(i)).startUpdating();
}
captureThread.start();
} void stopCaptureThread() {
captureThread = null;
frame.stopUpdating();
for(int i=0;i<sframes.size();i++){
((JDStatFrame)sframes.get(i)).stopUpdating();
}
} private ExecutorService exe=Executors.newFixedThreadPool(10);
public static final Map<InetAddress,String> hostnameCache=new HashMap<InetAddress, String>();
private PacketReceiver handler=new PacketReceiver(){
public void receivePacket(final Packet packet) {
packets.add(packet);
while (packets.size() > MAX_PACKETS_HOLD) {
packets.remove(0);
}
if (!sframes.isEmpty()) {
for (int i = 0; i < sframes.size(); i++)
((JDStatFrame)sframes.get(i)).addPacket(packet);
}
isSaved = false;
if(packet instanceof IPPacket){
exe.execute(new Runnable(){
public void run() {
IPPacket ip=(IPPacket)packet;
if(!hostnameCache.containsKey(ip.src_ip))
hostnameCache.put(ip.src_ip,ip.src_ip.getHostName());
if(!hostnameCache.containsKey(ip.dst_ip))
hostnameCache.put(ip.dst_ip,ip.dst_ip.getHostName());
System.out.println(hostnameCache.size());
}
});
}
}
};}