wamjeyi 2021-06-13 20:20 采纳率: 0%
浏览 33
已结题

终止按钮的监听想改成暂停,暂停线程怎么写代码啊?然后在点一下可以继续?

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");
        }
    }
}
  • 写回答

2条回答 默认 最新

  • 关注

    暂停线程可以使用wait方法,恢复线程对应是notify方法。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月21日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)