这就是最终效果。用了WindowBuilder构建gui。
开始捕获就去抓包,抓完包就存到数据库,并且回调到主线程中显示(有种Android既视感,只不过Android比JavaGui复杂无数倍)
用到的JList、JSipnner、JComBox控件
public class MainWindow implements CaptureListener {
// 数目
JLabel LabelTotal, LabelIP, LabelTCP, LabelUDP;
private JFrame frame;
JpcapCaptor jpcap;
// list
JList list;
// 抓包总数目
JSpinner sp_total_size;
// 包下拉
JComboBox box_packet_type;
// 抓取后的监听
CaptureListener listener;
// 抓包线程
Thread capThread;
// 接收回调类
TestPacketReceiver receiver;
// 网卡信息类
NetworkInterface nc;
NetworkInterface[] devices;
// 网卡的adapter
ComboBoxModel box_packet_type_mode;
// list adapter
DefaultListModel<Object> dlm;
// 全部
int spinner_num = -1;
int totalCount;
List<IPCapPacket> allList = new ArrayList<IPCapPacket>();
List<IPCapPacket> ipList = new ArrayList<IPCapPacket>();
List<TCPCapPacket> tcpList = new ArrayList<TCPCapPacket>();
List<UDPCapPacket> udpList = new ArrayList<UDPCapPacket>();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainWindow window = new MainWindow();
window.frame.setVisible(true);
/*
* TimerTask task = new TimerTask(){
*
* @Override public void run() { // TODO Auto-generated
* method stub
*
* } }; Timer timer = new Timer(); timer.schedule(task,
* 1000);
*/
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MainWindow() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 716, 641);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton bt_start = new JButton("\u5F00\u59CB\u6355\u83B7");
bt_start.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (null == nc) {
nc = devices[0];
box_packet_type_mode.setSelectedItem(nc);
}
try {
jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);
startCapThread(jpcap);
} catch (Exception ef) {
ef.printStackTrace();
System.out.println("启动失败: " + ef);
}
}
});
bt_start.setBounds(14, 145, 113, 27);
frame.getContentPane().add(bt_start);
JButton bt_stop = new JButton("\u505C\u6B62\u6355\u83B7");
bt_stop.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
jpcap.close();
// 移除监听
receiver.removeListener();
}
});
bt_stop.setBounds(159, 145, 113, 27);
frame.getContentPane().add(bt_stop);
JLabel label = new JLabel("\u76EE\u6807\u603B\u6570\uFF1A");
label.setBounds(18, 89, 104, 18);
frame.getContentPane().add(label);
sp_total_size = new JSpinner();
sp_total_size.setBounds(98, 85, 64, 24);
frame.getContentPane().add(sp_total_size);
JLabel label_1 = new JLabel("\u5F53\u524D\u65E0\u9650\u6355\u83B7");
label_1.setBounds(171, 87, 134, 18);
frame.getContentPane().add(label_1);
JProgressBar progressBar = new JProgressBar();
progressBar.setBounds(16, 567, 935, 14);
frame.getContentPane().add(progressBar);
// 包选择
String[] s = { "All","IP", "TCP", "UDP" };
box_packet_type = new JComboBox(s);
box_packet_type.setBounds(159, 195, 113, 24);
frame.getContentPane().add(box_packet_type);
box_packet_type.addActionListener(new comboxListener());
JLabel label_2 = new JLabel(
"\u9009\u62E9\u6570\u636E\u5305\u7C7B\u578B\uFF1A");
label_2.setBounds(14, 198, 202, 18);
frame.getContentPane().add(label_2);
// 网卡下拉菜单
devices = JpcapCaptor.getDeviceList();
box_packet_type_mode = new NetCardDataModel(devices);
JComboBox box_netcard = new JComboBox(box_packet_type_mode);
box_netcard.setBounds(98, 21, 174, 24);
frame.getContentPane().add(box_netcard);
JLabel label_3 = new JLabel("\u76EE\u6807\u7F51\u5361\uFF1A");
label_3.setBounds(18, 24, 88, 18);
frame.getContentPane().add(label_3);
list = new JList();
list.setBounds(18, 247, 677, 294);
frame.getContentPane().add(list);
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setBounds(18, 247, 677, 294);
frame.getContentPane().add(scrollPane);
dlm = new DefaultListModel<Object>();
LabelTotal = new JLabel("\u603B\u6570\uFF1A");
LabelTotal.setFont(new Font("宋体", Font.PLAIN, 20));
LabelTotal.setBounds(397, 24, 93, 18);
frame.getContentPane().add(LabelTotal);
LabelIP = new JLabel("IP\u6570\uFF1A");
LabelIP.setFont(new Font("宋体", Font.PLAIN, 20));
LabelIP.setBounds(397, 87, 93, 18);
frame.getContentPane().add(LabelIP);
LabelTCP = new JLabel("TCP\u6570\uFF1A");
LabelTCP.setFont(new Font("宋体", Font.PLAIN, 20));
LabelTCP.setBounds(397, 150, 93, 18);
frame.getContentPane().add(LabelTCP);
LabelUDP = new JLabel("UDP\u6570\uFF1A");
LabelUDP.setFont(new Font("宋体", Font.PLAIN, 20));
LabelUDP.setBounds(397, 213, 93, 18);
frame.getContentPane().add(LabelUDP);
}
// 将每个Captor放到独立线程中运行
public void startCapThread(final JpcapCaptor jpcap) {
java.lang.Runnable rnner = new Runnable() {
public void run() {
// 使用接包处理器循环抓包
receiver = new TestPacketReceiver();
receiver.setCaptureListener(MainWindow.this);
jpcap.loopPacket(spinner_num, receiver);
}
};
capThread = new Thread(rnner);
capThread.start();
// 启动抓包线程
}
@Override
public void capture(Object obj, String tpye, int totalCount, int curCount) {
// TODO Auto-generated method stub
allList.add((IPCapPacket)obj);
LabelTotal.setText("全部:" + totalCount);
if ("IP".equals(tpye)) {
dlm.addElement((IPCapPacket) obj);
ipList.add((IPCapPacket) obj);
if (ipList.size() % 30 == 0) {
list.setModel(dlm);
}
LabelIP.setText("IP:" + curCount);
} else if ("TCP".equals(tpye)) {
dlm.addElement((TCPCapPacket) obj);
tcpList.add((TCPCapPacket) obj);
if (tcpList.size() % 30 == 0) {
list.setModel(dlm);
}
LabelTCP.setText("TCP:" + curCount);
} else if ("UDP".equals(tpye)) {
dlm.addElement((UDPCapPacket) obj);
udpList.add((UDPCapPacket) obj);
if (udpList.size() % 30 == 0) {
list.setModel(dlm);
}
LabelUDP.setText("UDP:" + curCount);
}
}
private class comboxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
long o = e.getWhen();
switch (box_packet_type.getSelectedItem().toString()) {
case "All":
dlm.clear();
for (int i = 0; i < ipList.size(); i++) {
dlm.addElement((IPCapPacket)ipList.get(i));
}
break;
case "IP":
dlm.clear();
for (int i = 0; i < ipList.size(); i++) {
dlm.addElement((IPCapPacket)ipList.get(i));
}
break;
case "TCP":
dlm.clear();
for (int i = 0; i < tcpList.size(); i++) {
dlm.addElement((TCPCapPacket)tcpList.get(i));
}
break;
case "UDP":
dlm.clear();
for (int i = 0; i <udpList.size(); i++) {
dlm.addElement((UDPCapPacket)udpList.get(i));
}
break;
default:
break;
}
}
}
}
抓包监听
/**
* 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明
*
*/
class TestPacketReceiver implements PacketReceiver {
CaptureListener captureListener;
int totalCount = 0;
static MongoDbHelper2 helper;
int a, b, c;
public TestPacketReceiver() {
// TODO Auto-generated constructor stub
helper = MongoDbHelper2.getInstance();
helper.getConnection();
}
/**
* 实现的接包方法:
*/
public void receivePacket(Packet packet) {
if (packet instanceof jpcap.packet.IPPacket) {
IPPacket p = (IPPacket) packet;
IPCapPacket pCapPacket = new IPCapPacket();
// /192.168.1.102
pCapPacket.setDestinationAddress(p.dst_ip + "");
// /172.24.6.57
pCapPacket.setSourceAddress(p.src_ip + "");
// 4
pCapPacket.setVersionAndlength(p.version + "");
// 0
pCapPacket.setTypeOfService(p.rsv_tos + "");
// 212
pCapPacket.setTotalLength(p.length + "");
// 28372
pCapPacket.setIdetifier(p.ident + "");
// false0
pCapPacket.setFlagsAndOffser(p.d_flag + "" + p.offset);
// 59
pCapPacket.setTimeToLive(p.hop_limit + "");
// 17
pCapPacket.setProtocol(p.protocol + "");
// pCapPacket.setChecksum();
a++;
totalCount++;
helper.insert(MongoDbHelper.IPCollection, pCapPacket);
if (captureListener != null) {
captureListener.capture(pCapPacket, "IP", totalCount, a);
}
// System.out.println("insert:"+m);
}
// Tcp包,在java Socket中只能得到负载数据
if (packet instanceof jpcap.packet.TCPPacket) {
TCPPacket p = (TCPPacket) packet;
TCPCapPacket pCapPacket = new TCPCapPacket();
pCapPacket.setDestinationAddress(p.dst_ip + "");
pCapPacket.setDestinationPort(p.dst_port + "");
pCapPacket.setDestinationAddress(p.src_ip + "");
pCapPacket.setSourcePort(p.src_port + "");
pCapPacket.setSerialNumber(p.sec + "");
pCapPacket.setConfrimNumber(p.ack_num + "");
pCapPacket.setWindowSize(p.window + "");
// pCapPacket.setTcpCheckSum();
pCapPacket.setUrgentPointer(p.urgent_pointer + "");
b++;
totalCount++;
helper.insert(MongoDbHelper.TCPCollection, pCapPacket);
if (captureListener != null) {
captureListener.capture(pCapPacket, "TCP", totalCount, b);
}
}
if (packet instanceof jpcap.packet.UDPPacket) {
UDPPacket p = (UDPPacket) packet;
UDPCapPacket udpCapPacket = new UDPCapPacket();
udpCapPacket.setDestinationAddress(p.dst_ip + "");
udpCapPacket.setDestinationPort(p.dst_port + "");
udpCapPacket.setDestinationAddress(p.src_ip + "");
udpCapPacket.setSourcePort(p.src_port + "");
// udpCapPacket.setCheckSum();
udpCapPacket.setUdpLength(p.len);
c++;
totalCount++;
helper.insert(MongoDbHelper.UDPCollection, udpCapPacket);
if (captureListener != null) {
captureListener.capture(udpCapPacket, "UDP", totalCount, c);
}
}
}
public void setCaptureListener(CaptureListener captureListener) {
this.captureListener = captureListener;
}
public void removeListener() {
// TODO Auto-generated method stub
captureListener = null;
}
interface CaptureListener {
void capture(Object obj, String tpye, int totalNum, int curNum);
}
}
以及三个封装包类和数据库连接类,这里就不贴代码了