Java实现消息轰炸的方法 附带源码

1. 用到的技术

ArrayList
Robot (java中自动控制电脑输入设备的封装类)
swing
awt

先写个最简单的Demo然后逐渐完善。

2. 使用Robot 自动发送消息(v1.0)

robot.delay(3000); 停止3000毫秒

KeyEvent.VK_W是java封装好的常量,本质上就是就是每一个按键对应一个id

太多了,就截取了一部分。

按键事件:(还有鼠标按钮点击事件,这里我们主要使用了键盘点击事件)
robot.keyPress(KeyEvent.VK_W); 按下W键
robot.keyRelease(KeyEvent.VK_W); W键弹起

代码:

import java.awt.*;
import java.awt.event.KeyEvent;

public class TestRobot2 {

    public static void main(String[] args) throws AWTException {
        Robot robot = new Robot();
        robot.delay(3000);

        for (int i = 0; i < 5; i++) {
            robot.keyPress(KeyEvent.VK_W);
            robot.keyRelease(KeyEvent.VK_W);
            robot.keyPress(KeyEvent.VK_O);
            robot.keyRelease(KeyEvent.VK_O);
            robot.keyPress(KeyEvent.VK_A);
            robot.keyRelease(KeyEvent.VK_A);
            robot.keyPress(KeyEvent.VK_I);
            robot.keyRelease(KeyEvent.VK_I);
            robot.keyPress(KeyEvent.VK_N);
            robot.keyRelease(KeyEvent.VK_N);
            robot.keyPress(KeyEvent.VK_I);
            robot.keyRelease(KeyEvent.VK_I);
            robot.delay(100);
            robot.keyPress(KeyEvent.VK_SPACE);
            robot.keyRelease(KeyEvent.VK_SPACE);
            robot.delay(100);
            robot.keyPress(KeyEvent.VK_ENTER);
            robot.keyRelease(KeyEvent.VK_ENTER);
        }

    }
}

使用for循环可以反复发送该消息。
(注意:如果循环使用了死循环,一定要在robot中添加延时函数,否则发送消息的QQ会卡死,亲测)

效果:

3. 记录用户操作(v2.0)

染过要实现自动发消息,不可能让用户像上一步一样去直接与代码打交道,并且对于我们来说,如果每次都像上一步那样,既费时又费力,那么可不可以用一个相对来说比较简便的方法呢,它来了。

我们应该知道,java中每个按键对应了一个id,那是不是就可以将这些id存储起来,在使用的时候调用它呢

这里我们先存储用户的操作信息,还原是下一步

实现方法:
使用ArrayList动态数组,存储用户操作信息

还可以使用switch语句,给用户提示信息:
先上一部分代码:

 ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存储用户操作的动态数组

    int n = 0;//自定义一个变量,用于存储式第几次,和下面的 addList方法搭配使用

    //这个方法用于向数组汇总存储用户的操作信息
    public void addList(int Key, String name) {
        //自定义了一个对象,KeyValue,里面有Key和Value两个自定义值
        list.add(new KeyValue(++n, Key, name));
    }

自定义的KeyValue对象:

class KeyValue {
    public int Num;//存储是第几次按下的
    public int Key;//存储按键对应的KeyCode
    public String Value;//存储按键的信息,主要用于给用户提示

    public KeyValue(int num, int key, String value) {
        Key = key;
        Num = num;
        Value = value;
    }
}

先看看效果:

上代码:

package GUI.Demo0418;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

//尝试写个记录按键记录的demo
public class Test {
    public static void main(String[] args) throws AWTException {
        new MyFrame();
    }
}

class MyFrame extends Frame {

    ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存储用户操作的动态数组

    int n = 0;//自定义一个变量,用于存储式第几次,和下面的 addList方法搭配使用

    //这个方法用于向数组汇总存储用户的操作信息
    public void addList(int Key, String name) {
        //自定义了一个对象,KeyValue,里面有Key和Value两个自定义值
        list.add(new KeyValue(++n, Key, name));
    }

    public MyFrame() throws AWTException {
        super("记录用户的按键操作");

        JButton button3 = new JButton("查看记录信息");

        button3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (KeyValue ky : list) {
                    System.out.println("第" + ky.Num + "次" + ky.Key + " " + ky.Value);
                }
            }
        });

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("窗口正在关闭");
                System.exit(0);
            }
        });

        setLayout(new FlowLayout(FlowLayout.LEADING));

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                switch (keyCode) {
                    case KeyEvent.VK_A:
                        System.out.println("你点击了 A 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "A");
                        break;
                    case KeyEvent.VK_B:
                        System.out.println("你点击了 B 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "B");
                        break;
                    case KeyEvent.VK_C:
                        System.out.println("你点击了 C 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "C");
                        break;
                    case KeyEvent.VK_D:
                        System.out.println("你点击了 D 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "D");
                        break;
                    case KeyEvent.VK_E:
                        System.out.println("你点击了 E 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "E");
                        break;
                    case KeyEvent.VK_F:
                        System.out.println("你点击了 F 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "F");
                        break;
                    case KeyEvent.VK_G:
                        System.out.println("你点击了 G 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "G");
                        break;
                    case KeyEvent.VK_H:
                        System.out.println("你点击了 H 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "H");
                        break;
                    case KeyEvent.VK_I:
                        System.out.println("你点击了 I 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "I");
                        break;
                    case KeyEvent.VK_J:
                        System.out.println("你点击了 J 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "J");
                        break;
                    case KeyEvent.VK_K:
                        System.out.println("你点击了 K 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "K");
                        break;
                    case KeyEvent.VK_L:
                        System.out.println("你点击了 L 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "L");
                        break;
                    case KeyEvent.VK_M:
                        System.out.println("你点击了 M 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "M");
                        break;
                    case KeyEvent.VK_N:
                        System.out.println("你点击了 N 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "N");
                        break;
                    case KeyEvent.VK_O:
                        System.out.println("你点击了 O 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "O");
                        break;
                    case KeyEvent.VK_P:
                        System.out.println("你点击了 P 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "P");
                        break;
                    case KeyEvent.VK_Q:
                        System.out.println("你点击了 Q 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Q");
                        break;
                    case KeyEvent.VK_R:
                        System.out.println("你点击了 R 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "R");
                        break;
                    case KeyEvent.VK_S:
                        System.out.println("你点击了 S 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "S");
                        break;
                    case KeyEvent.VK_T:
                        System.out.println("你点击了 T 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "T");
                        break;
                    case KeyEvent.VK_U:
                        System.out.println("你点击了 U 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "U");
                        break;
                    case KeyEvent.VK_V:
                        System.out.println("你点击了 V 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "V");
                        break;
                    case KeyEvent.VK_W:
                        System.out.println("你点击了 W 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "W");
                        break;
                    case KeyEvent.VK_X:
                        System.out.println("你点击了 X 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "X");
                        break;
                    case KeyEvent.VK_Y:
                        System.out.println("你点击了 Y 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Y");
                        break;
                    case KeyEvent.VK_Z:
                        System.out.println("你点击了 Z 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Z");
                        break;
                    case KeyEvent.VK_SPACE:
                        System.out.println("你点击了 空格 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "空格");
                        break;
                    case KeyEvent.VK_ENTER:
                        System.out.println("你点击了 ENTER 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "回车");
                        break;
                    default:
                        System.out.println("该按键没有收录");
                }
            }
        });

        add(button3);
        setBounds(100, 100, 500, 500);
        setVisible(true);
        setResizable(false);
        setAlwaysOnTop(true);
    }
}

class KeyValue {
    public int Num;
    public int Key;
    public String Value;

    public KeyValue(int num, int key, String value) {
        Key = key;
        Num = num;
        Value = value;
    }

}

4. 还原操作(v3.0)

简单的说就是遍历上一步存储的用户操作信息,再加上几个按钮,用来控制何时进行还原,和还原的次数。
直接上代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

//尝试写个记录按键记录的demo
public class Test {
    public static void main(String[] args) throws AWTException {
        new MyFrame();
    }
}

class MyFrame extends Frame {

    ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存储用户操作的动态数组
    Robot robot = new Robot();

    //下拉框,用于获取用户想要发送几次这个消息
    String[] num = {"1", "2", "3", "4", "5", "6", "10", "死"};
    JComboBox jComboBox = new JComboBox(num);

    int n = 0;//自定义一个变量,用于存储式第几次,和下面的 addList方法搭配使用

    //这个方法用于向数组汇总存储用户的操作信息
    public void addList(int Key, String name) {
        //自定义了一个对象,KeyValue,里面有Key和Value两个自定义值
        list.add(new KeyValue(++n, Key, name));
    }

    public MyFrame() throws AWTException {
        super("记录用户的按键操作");
        JButton button1 = new JButton("清空");
        JButton button2 = new JButton("开始");
        JButton button3 = new JButton("查看记录信息");

        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                list = null;
            }
        });
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                robot.delay(3000);
                System.out.println(jComboBox.getSelectedItem());

                if (jComboBox.getSelectedItem().equals("死")) {
                    while (true) {
                        for (KeyValue ky : list) {
                            robot.keyPress(ky.Key);
                            robot.keyRelease(ky.Key);
                            robot.delay(10);
                        }
                    }
                } else {
                    int time = Integer.parseInt((String) jComboBox.getSelectedItem());
                    for (int i = 0; i < time; i++) {
                        for (KeyValue ky : list) {
                            robot.keyPress(ky.Key);
                            robot.keyRelease(ky.Key);
                            robot.delay(100);
                        }
                    }
                }

            }
        });
        button3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (KeyValue ky : list) {
                    System.out.println("第" + ky.Num + "次" + ky.Key + " " + ky.Value);
                }
            }
        });

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("窗口正在关闭");
                System.exit(0);
            }
        });

        setLayout(new FlowLayout(FlowLayout.LEADING));

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                switch (keyCode) {
                    case KeyEvent.VK_A:
                        System.out.println("你点击了 A 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "A");
                        break;
                    case KeyEvent.VK_B:
                        System.out.println("你点击了 B 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "B");
                        break;
                    case KeyEvent.VK_C:
                        System.out.println("你点击了 C 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "C");
                        break;
                    case KeyEvent.VK_D:
                        System.out.println("你点击了 D 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "D");
                        break;
                    case KeyEvent.VK_E:
                        System.out.println("你点击了 E 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "E");
                        break;
                    case KeyEvent.VK_F:
                        System.out.println("你点击了 F 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "F");
                        break;
                    case KeyEvent.VK_G:
                        System.out.println("你点击了 G 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "G");
                        break;
                    case KeyEvent.VK_H:
                        System.out.println("你点击了 H 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "H");
                        break;
                    case KeyEvent.VK_I:
                        System.out.println("你点击了 I 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "I");
                        break;
                    case KeyEvent.VK_J:
                        System.out.println("你点击了 J 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "J");
                        break;
                    case KeyEvent.VK_K:
                        System.out.println("你点击了 K 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "K");
                        break;
                    case KeyEvent.VK_L:
                        System.out.println("你点击了 L 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "L");
                        break;
                    case KeyEvent.VK_M:
                        System.out.println("你点击了 M 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "M");
                        break;
                    case KeyEvent.VK_N:
                        System.out.println("你点击了 N 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "N");
                        break;
                    case KeyEvent.VK_O:
                        System.out.println("你点击了 O 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "O");
                        break;
                    case KeyEvent.VK_P:
                        System.out.println("你点击了 P 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "P");
                        break;
                    case KeyEvent.VK_Q:
                        System.out.println("你点击了 Q 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Q");
                        break;
                    case KeyEvent.VK_R:
                        System.out.println("你点击了 R 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "R");
                        break;
                    case KeyEvent.VK_S:
                        System.out.println("你点击了 S 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "S");
                        break;
                    case KeyEvent.VK_T:
                        System.out.println("你点击了 T 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "T");
                        break;
                    case KeyEvent.VK_U:
                        System.out.println("你点击了 U 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "U");
                        break;
                    case KeyEvent.VK_V:
                        System.out.println("你点击了 V 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "V");
                        break;
                    case KeyEvent.VK_W:
                        System.out.println("你点击了 W 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "W");
                        break;
                    case KeyEvent.VK_X:
                        System.out.println("你点击了 X 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "X");
                        break;
                    case KeyEvent.VK_Y:
                        System.out.println("你点击了 Y 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Y");
                        break;
                    case KeyEvent.VK_Z:
                        System.out.println("你点击了 Z 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "Z");
                        break;
                    case KeyEvent.VK_SPACE:
                        System.out.println("你点击了 空格 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "空格");
                        break;
                    case KeyEvent.VK_ENTER:
                        System.out.println("你点击了 ENTER 键,这个按键的ID为:" + keyCode);
                        addList(keyCode, "回车");
                        break;
                    default:
                        System.out.println("该按键没有收录");
                }
            }
        });

        add(button1);
        add(jComboBox);
        add(button2);
        add(button3);
        setBounds(100, 100, 500, 500);
        setVisible(true);
        setResizable(false);
        setAlwaysOnTop(true);
    }

}

class KeyValue {
    public int Num;
    public int Key;
    public String Value;

    public KeyValue(int num, int key, String value) {
        Key = key;
        Num = num;
        Value = value;
    }
}

效果:

5. 总结

昨天晚上突然跳出的想法,花了点时间实现了,虽然界面不太美观,但是想要的功能都实现了,感觉代码冗余有点多。。可能会有梗简洁的代码吧(时间紧,博客写的有点匆忙)

到此这篇关于Java实现消息轰炸 附带源码的文章就介绍到这了,更多相关java消息轰炸内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java并发编程之ConcurrentLinkedQueue源码详解

    一.ConcurrentLinkedQueue介绍 并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式: 方式1:加锁,这种实现方式就是我们常说的阻塞队列. 方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列. 从点到面, 下面我们来看下非阻塞队列经典实现类:ConcurrentLinkedQueue (JDK1.8版) ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列.当我们添加一个元素的时候,它会添加到队列的尾部,当我们

  • Java多线程之ReentrantReadWriteLock源码解析

    一.介绍 1.1 ReentrantReadWriteLock ReentrantReadWriteLock 是一个读写锁,允许多个读或者一个写线程在执行. 内部的 Sync 继承自 AQS,这个 Sync 包含一个共享读锁 ReadLock 和一个独占写锁 WriteLock. 该锁可以设置公平和非公平,默认非公平. 一个持有写锁的线程可以获取读锁.如果该线程先持有写锁,再持有读锁并释放写锁,称为锁降级. WriteLock支持Condition并且与ReentrantLock语义一致,而Re

  • Java实战之贪吃蛇小游戏(源码+注释)

    一.工程文件 二.Main.java package com.company; import javax.swing.*; public class Main { public static void main(String[] args) { //创建窗体对象 JFrame frame = new JFrame(); //创建窗体参数() frame.setBounds(10,10,900,720); //设置不允许更改大小 //frame.setResizable(false); //设置关

  • java实战之飞机大战小游戏(源码加注释)

    一.工程文件 二.Main.java 主函数,实现类 package ui; //主函数实现 public class Main { public static void main(String[] args) { //创建窗体 GameFrame frame = new GameFrame(); //创建面板 GamePanel panel = new GamePanel(frame); //调用开始游戏的方法启动游戏 panel.action(); //将面板加入到窗体中 frame.add

  • Java源码解析之HashMap的put、resize方法详解

    一.HashMap 简介 HashMap 底层采用哈希表结构 数组加链表加红黑树实现,允许储存null键和null值 数组优点:通过数组下标可以快速实现对数组元素的访问,效率高 链表优点:插入或删除数据不需要移动元素,只需要修改节点引用效率高 二.源码分析 2.1 继承和实现 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {

  • 使用Intellij IDEA查看Java源码技巧

    1 查看接口的实现类:Ctrl+Alt+B 选中按快捷键,然后跳到实现类的地方去 2 返回上/下个光标地方:Alt+<- 和 Alt+-> 可通过修改快捷键(搜关键字left.right)找到对应并改为 Ctrl+J.... 3 查看Java方法调用树(被调/主调):Ctrl+Alt+H 分为调用当前方法的树.当前方法调用的下级方法 4 查看表达式.变量.方法参数的传递关系:主菜单中选择Analyze | Dataflow from/to Here ....不好用 5 查看类继承关系图:Ctr

  • Java并发编程之CountDownLatch源码解析

    一.前言 CountDownLatch维护了一个计数器(还是是state字段),调用countDown方法会将计数器减1,调用await方法会阻塞线程直到计数器变为0.可以用于实现一个线程等待所有子线程任务完成之后再继续执行的逻辑,也可以实现类似简易CyclicBarrier的功能,达到让多个线程等待同时开始执行某一段逻辑目的. 二.使用 一个线程等待其它线程执行完再继续执行 ...... CountDownLatch cdl = new CountDownLatch(10); Executor

  • Java实现多人聊天室的原理与源码

    多人聊天室原理图 源码 工具类: 该类用于关闭各种流. public class CloseUtil { public static void CloseAll(Closeable... closeable){ for(Closeable c:closeable){ if (c != null) { try { c.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 服务器: 服务器端创建一个serverSocket

  • 彻底了解java中ReentrantLock和AQS的源码

    一.前言 首先在聊ReentrantLock之前,我们需要知道整个JUC的并发同步的基石,currrent里面所有的共享变量都是由volatile修饰的,我们知道volatile的语义有2大特点,可见性以及防止重排序(内存屏障,volatie写与volatile读) 1.当第二个操作为volatile写操做时,不管第一个操作是什么(普通读写或者volatile读写),都不能进行重排序.这个规则确保volatile写之前的所有操作都不会被重排序到volatile之后; 2.当第一个操作为volat

  • Java concurrency集合之ConcurrentLinkedQueue_动力节点Java学院整理

    ConcurrentLinkedQueue介绍 ConcurrentLinkedQueue是线程安全的队列,它适用于"高并发"的场景. 它是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序.队列元素中不可以放置null元素(内部实现的特殊节点除外). ConcurrentLinkedQueue原理和数据结构 ConcurrentLinkedQueue的数据结构,如下图所示: 说明: 1. ConcurrentLinkedQueue继承于AbstractQ

随机推荐