import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.PacketReceiver;
import jpcap.packet.EthernetPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
public class Tcpflowstatistics{
private static Tcpflowstatistics ts;
private boolean flag=true;
JFrame jf;
JButton bt1,bt2;
static JTextArea jta;
JScrollPane jsp;
JPanel jp1;
Tcpflowstatistics(){
jf=new JFrame("TCP流量统计器");
jf.setLayout(new BorderLayout());
jf.setVisible(true);
jf.setSize(800,600);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jta=new JTextArea();
jta.setVisible(true);
jp1=new JPanel();
jsp=new JScrollPane();
bt1=new JButton("开始");
bt2=new JButton("终止");
bt1.setBounds(20, 50, 100, 30);
bt2.setBounds(20, 50, 100, 30);
jsp.setViewportView(jta);
jp1.add(bt1);
jp1.add(bt2);
jp1.setVisible(true);
jf.add(jp1,BorderLayout.NORTH);
jf.add(jsp,BorderLayout.CENTER);
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bt1Action(e);
}
});
bt2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bt2Action(e);
}
});
}
public static void main(String[] args) {
new Tcpflowstatistics();
}
public void init(){
final jpcap.NetworkInterface[] devices= JpcapCaptor.getDeviceList();
for (int i=0;i<devices.length;i++){
NetworkInterface ni=devices[i];
if (ni.addresses.length>0){
String addr=ni.addresses[0].address.toString();
try{
JpcapCaptor jpcap=JpcapCaptor.openDevice(ni,2000,true,20);
LoopPacketThread ipt=new LoopPacketThread(jpcap,addr);
ipt.start();
jta.append(addr+"上的采集线程已启动!!!"+"\n");
}catch (IOException e){
e.printStackTrace();
System.out.println("抓取数据包出现异常!!!");
}
}
}
}
public void bt1Action(ActionEvent e){
init();
}
public void bt2Action(ActionEvent e){
System.exit(0);
}
}
class LoopPacketThread extends Thread {
private JpcapCaptor jpcap = null;
private String ipAddr = "";
public LoopPacketThread(JpcapCaptor jpcap, String ipAddr) {
this.jpcap = jpcap;
this.ipAddr = ipAddr;
}
public void run() {
this.jpcap.loopPacket(-1, new ReceivePacket(this.ipAddr));
}
}
class ReceivePacket implements PacketReceiver{
private String ipAddr="";
public ReceivePacket(String ipAddr){
this.ipAddr=ipAddr;
}
public void receivePacket(Packet packet){
if (packet instanceof jpcap.packet.TCPPacket){
TCPPacket tcp=(TCPPacket)packet;
EthernetPacket ethernetPacket=(EthernetPacket)packet.datalink;
Tcpflowstatistics.jta.append("=============================================================="+"\n");
Tcpflowstatistics.jta.append("TCPPacket"+"\n");
Tcpflowstatistics.jta.append("此数据包的源IP地址:"+tcp.src_ip+"\n");
Tcpflowstatistics.jta.append("此数据包的目的IP地址:"+tcp.dst_ip+"\n");
Tcpflowstatistics.jta.append("此数据包的发送端口号:"+tcp.src_port+"\n");
Tcpflowstatistics.jta.append("此数据包的接收端口号:"+tcp.dst_port+"\n");
Tcpflowstatistics.jta.append("---*此数据包的源MAC地址:"+ethernetPacket.getSourceAddress()+"\n");
Tcpflowstatistics.jta.append("---*此数据包的目的MAC地址:"+ethernetPacket.getDestinationAddress()+"\n");
Tcpflowstatistics.jta.append("---*此数据包的传输层协议类型:"+tcp.protocol+"(TCP)"+"\n");
Tcpflowstatistics.jta.append("此数据包的长度:"+tcp.len+"\n");
}
}
}