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"); } } }
暂停线程可以使用wait方法,恢复线程对应是notify方法。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps: 问答会员【8折】购 ,仅需→¥23.2,即可享受5次/月 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m