Java實現(xiàn)消息轟炸的方法 附帶源碼
1. 用到的技術(shù)
ArrayList
Robot (java中自動控制電腦輸入設(shè)備的封裝類)
swing
awt
先寫個最簡單的Demo然后逐漸完善。
2. 使用Robot 自動發(fā)送消息(v1.0)
robot.delay(3000); 停止3000毫秒
KeyEvent.VK_W是java封裝好的常量,本質(zhì)上就是就是每一個按鍵對應(yīng)一個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循環(huán)可以反復發(fā)送該消息。
(注意:如果循環(huán)使用了死循環(huán),一定要在robot中添加延時函數(shù),否則發(fā)送消息的QQ會卡死,親測)
效果:

3. 記錄用戶操作(v2.0)
染過要實現(xiàn)自動發(fā)消息,不可能讓用戶像上一步一樣去直接與代碼打交道,并且對于我們來說,如果每次都像上一步那樣,既費時又費力,那么可不可以用一個相對來說比較簡便的方法呢,它來了。
我們應(yīng)該知道,java中每個按鍵對應(yīng)了一個id,那是不是就可以將這些id存儲起來,在使用的時候調(diào)用它呢
這里我們先存儲用戶的操作信息,還原是下一步
實現(xiàn)方法:
使用ArrayList動態(tài)數(shù)組,存儲用戶操作信息
還可以使用switch語句,給用戶提示信息:
先上一部分代碼:
ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存儲用戶操作的動態(tài)數(shù)組
int n = 0;//自定義一個變量,用于存儲式第幾次,和下面的 addList方法搭配使用
//這個方法用于向數(shù)組匯總存儲用戶的操作信息
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;//存儲按鍵對應(yīng)的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>();//用于存儲用戶操作的動態(tài)數(shù)組
int n = 0;//自定義一個變量,用于存儲式第幾次,和下面的 addList方法搭配使用
//這個方法用于向數(shù)組匯總存儲用戶的操作信息
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("窗口正在關(guān)閉");
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)
簡單的說就是遍歷上一步存儲的用戶操作信息,再加上幾個按鈕,用來控制何時進行還原,和還原的次數(shù)。
直接上代碼:
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>();//用于存儲用戶操作的動態(tài)數(shù)組
Robot robot = new Robot();
//下拉框,用于獲取用戶想要發(fā)送幾次這個消息
String[] num = {"1", "2", "3", "4", "5", "6", "10", "死"};
JComboBox jComboBox = new JComboBox(num);
int n = 0;//自定義一個變量,用于存儲式第幾次,和下面的 addList方法搭配使用
//這個方法用于向數(shù)組匯總存儲用戶的操作信息
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("窗口正在關(guān)閉");
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. 總結(jié)
昨天晚上突然跳出的想法,花了點時間實現(xiàn)了,雖然界面不太美觀,但是想要的功能都實現(xiàn)了,感覺代碼冗余有點多。??赡軙泄:啙嵉拇a吧(時間緊,博客寫的有點匆忙)
到此這篇關(guān)于Java實現(xiàn)消息轟炸 附帶源碼的文章就介紹到這了,更多相關(guān)java消息轟炸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java concurrency集合之ConcurrentLinkedQueue_動力節(jié)點Java學院整理
- Java多線程之ReentrantReadWriteLock源碼解析
- java實戰(zhàn)之飛機大戰(zhàn)小游戲(源碼加注釋)
- Java實戰(zhàn)之貪吃蛇小游戲(源碼+注釋)
- Java源碼解析之HashMap的put、resize方法詳解
- Java并發(fā)編程之CountDownLatch源碼解析
- 使用Intellij IDEA查看Java源碼技巧
- 徹底了解java中ReentrantLock和AQS的源碼
- Java實現(xiàn)多人聊天室的原理與源碼
- Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
相關(guān)文章
JSON復雜數(shù)據(jù)處理之Json樹形結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)Java對象并存儲到數(shù)據(jù)庫的實現(xiàn)
這篇文章主要介紹了JSON復雜數(shù)據(jù)處理之Json樹形結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)Java對象并存儲到數(shù)據(jù)庫的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-03-03
RestTemplate如何添加請求頭headers和請求體body
這篇文章主要介紹了RestTemplate如何添加請求頭headers和請求體body問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析
這篇文章主要介紹了Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08

