Java實(shí)現(xiàn)消息轟炸的方法 附帶源碼
1. 用到的技術(shù)
ArrayList
Robot (java中自動(dòng)控制電腦輸入設(shè)備的封裝類)
swing
awt
先寫個(gè)最簡(jiǎn)單的Demo然后逐漸完善。
2. 使用Robot 自動(dòng)發(fā)送消息(v1.0)
robot.delay(3000); 停止3000毫秒
KeyEvent.VK_W是java封裝好的常量,本質(zhì)上就是就是每一個(gè)按鍵對(duì)應(yīng)一個(gè)id
太多了,就截取了一部分。
按鍵事件:(還有鼠標(biāo)按鈕點(diǎn)擊事件,這里我們主要使用了鍵盤點(diǎn)擊事件)
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ù)發(fā)送該消息。
(注意:如果循環(huán)使用了死循環(huán),一定要在robot中添加延時(shí)函數(shù),否則發(fā)送消息的QQ會(huì)卡死,親測(cè))
效果:
3. 記錄用戶操作(v2.0)
染過(guò)要實(shí)現(xiàn)自動(dòng)發(fā)消息,不可能讓用戶像上一步一樣去直接與代碼打交道,并且對(duì)于我們來(lái)說(shuō),如果每次都像上一步那樣,既費(fèi)時(shí)又費(fèi)力,那么可不可以用一個(gè)相對(duì)來(lái)說(shuō)比較簡(jiǎn)便的方法呢,它來(lái)了。
我們應(yīng)該知道,java中每個(gè)按鍵對(duì)應(yīng)了一個(gè)id,那是不是就可以將這些id存儲(chǔ)起來(lái),在使用的時(shí)候調(diào)用它呢
這里我們先存儲(chǔ)用戶的操作信息,還原是下一步
實(shí)現(xiàn)方法:
使用ArrayList動(dòng)態(tài)數(shù)組,存儲(chǔ)用戶操作信息
還可以使用switch語(yǔ)句,給用戶提示信息:
先上一部分代碼:
ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存儲(chǔ)用戶操作的動(dòng)態(tài)數(shù)組 int n = 0;//自定義一個(gè)變量,用于存儲(chǔ)式第幾次,和下面的 addList方法搭配使用 //這個(gè)方法用于向數(shù)組匯總存儲(chǔ)用戶的操作信息 public void addList(int Key, String name) { //自定義了一個(gè)對(duì)象,KeyValue,里面有Key和Value兩個(gè)自定義值 list.add(new KeyValue(++n, Key, name)); }
自定義的KeyValue對(duì)象:
class KeyValue { public int Num;//存儲(chǔ)是第幾次按下的 public int Key;//存儲(chǔ)按鍵對(duì)應(yīng)的KeyCode public String Value;//存儲(chǔ)按鍵的信息,主要用于給用戶提示 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; //嘗試寫個(gè)記錄按鍵記錄的demo public class Test { public static void main(String[] args) throws AWTException { new MyFrame(); } } class MyFrame extends Frame { ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存儲(chǔ)用戶操作的動(dòng)態(tài)數(shù)組 int n = 0;//自定義一個(gè)變量,用于存儲(chǔ)式第幾次,和下面的 addList方法搭配使用 //這個(gè)方法用于向數(shù)組匯總存儲(chǔ)用戶的操作信息 public void addList(int Key, String name) { //自定義了一個(gè)對(duì)象,KeyValue,里面有Key和Value兩個(gè)自定義值 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("你點(diǎn)擊了 A 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "A"); break; case KeyEvent.VK_B: System.out.println("你點(diǎn)擊了 B 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "B"); break; case KeyEvent.VK_C: System.out.println("你點(diǎn)擊了 C 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "C"); break; case KeyEvent.VK_D: System.out.println("你點(diǎn)擊了 D 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "D"); break; case KeyEvent.VK_E: System.out.println("你點(diǎn)擊了 E 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "E"); break; case KeyEvent.VK_F: System.out.println("你點(diǎn)擊了 F 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "F"); break; case KeyEvent.VK_G: System.out.println("你點(diǎn)擊了 G 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "G"); break; case KeyEvent.VK_H: System.out.println("你點(diǎn)擊了 H 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "H"); break; case KeyEvent.VK_I: System.out.println("你點(diǎn)擊了 I 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "I"); break; case KeyEvent.VK_J: System.out.println("你點(diǎn)擊了 J 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "J"); break; case KeyEvent.VK_K: System.out.println("你點(diǎn)擊了 K 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "K"); break; case KeyEvent.VK_L: System.out.println("你點(diǎn)擊了 L 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "L"); break; case KeyEvent.VK_M: System.out.println("你點(diǎn)擊了 M 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "M"); break; case KeyEvent.VK_N: System.out.println("你點(diǎn)擊了 N 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "N"); break; case KeyEvent.VK_O: System.out.println("你點(diǎn)擊了 O 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "O"); break; case KeyEvent.VK_P: System.out.println("你點(diǎn)擊了 P 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "P"); break; case KeyEvent.VK_Q: System.out.println("你點(diǎn)擊了 Q 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Q"); break; case KeyEvent.VK_R: System.out.println("你點(diǎn)擊了 R 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "R"); break; case KeyEvent.VK_S: System.out.println("你點(diǎn)擊了 S 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "S"); break; case KeyEvent.VK_T: System.out.println("你點(diǎn)擊了 T 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "T"); break; case KeyEvent.VK_U: System.out.println("你點(diǎn)擊了 U 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "U"); break; case KeyEvent.VK_V: System.out.println("你點(diǎn)擊了 V 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "V"); break; case KeyEvent.VK_W: System.out.println("你點(diǎn)擊了 W 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "W"); break; case KeyEvent.VK_X: System.out.println("你點(diǎn)擊了 X 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "X"); break; case KeyEvent.VK_Y: System.out.println("你點(diǎn)擊了 Y 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Y"); break; case KeyEvent.VK_Z: System.out.println("你點(diǎn)擊了 Z 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Z"); break; case KeyEvent.VK_SPACE: System.out.println("你點(diǎn)擊了 空格 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "空格"); break; case KeyEvent.VK_ENTER: System.out.println("你點(diǎn)擊了 ENTER 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "回車"); break; default: System.out.println("該按鍵沒(méi)有收錄"); } } }); 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)
簡(jiǎn)單的說(shuō)就是遍歷上一步存儲(chǔ)的用戶操作信息,再加上幾個(gè)按鈕,用來(lái)控制何時(shí)進(jìn)行還原,和還原的次數(shù)。
直接上代碼:
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; //嘗試寫個(gè)記錄按鍵記錄的demo public class Test { public static void main(String[] args) throws AWTException { new MyFrame(); } } class MyFrame extends Frame { ArrayList<KeyValue> list = new ArrayList<KeyValue>();//用于存儲(chǔ)用戶操作的動(dòng)態(tài)數(shù)組 Robot robot = new Robot(); //下拉框,用于獲取用戶想要發(fā)送幾次這個(gè)消息 String[] num = {"1", "2", "3", "4", "5", "6", "10", "死"}; JComboBox jComboBox = new JComboBox(num); int n = 0;//自定義一個(gè)變量,用于存儲(chǔ)式第幾次,和下面的 addList方法搭配使用 //這個(gè)方法用于向數(shù)組匯總存儲(chǔ)用戶的操作信息 public void addList(int Key, String name) { //自定義了一個(gè)對(duì)象,KeyValue,里面有Key和Value兩個(gè)自定義值 list.add(new KeyValue(++n, Key, name)); } public MyFrame() throws AWTException { super("記錄用戶的按鍵操作"); JButton button1 = new JButton("清空"); JButton button2 = new JButton("開(kāi)始"); 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("你點(diǎn)擊了 A 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "A"); break; case KeyEvent.VK_B: System.out.println("你點(diǎn)擊了 B 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "B"); break; case KeyEvent.VK_C: System.out.println("你點(diǎn)擊了 C 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "C"); break; case KeyEvent.VK_D: System.out.println("你點(diǎn)擊了 D 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "D"); break; case KeyEvent.VK_E: System.out.println("你點(diǎn)擊了 E 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "E"); break; case KeyEvent.VK_F: System.out.println("你點(diǎn)擊了 F 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "F"); break; case KeyEvent.VK_G: System.out.println("你點(diǎn)擊了 G 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "G"); break; case KeyEvent.VK_H: System.out.println("你點(diǎn)擊了 H 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "H"); break; case KeyEvent.VK_I: System.out.println("你點(diǎn)擊了 I 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "I"); break; case KeyEvent.VK_J: System.out.println("你點(diǎn)擊了 J 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "J"); break; case KeyEvent.VK_K: System.out.println("你點(diǎn)擊了 K 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "K"); break; case KeyEvent.VK_L: System.out.println("你點(diǎn)擊了 L 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "L"); break; case KeyEvent.VK_M: System.out.println("你點(diǎn)擊了 M 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "M"); break; case KeyEvent.VK_N: System.out.println("你點(diǎn)擊了 N 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "N"); break; case KeyEvent.VK_O: System.out.println("你點(diǎn)擊了 O 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "O"); break; case KeyEvent.VK_P: System.out.println("你點(diǎn)擊了 P 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "P"); break; case KeyEvent.VK_Q: System.out.println("你點(diǎn)擊了 Q 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Q"); break; case KeyEvent.VK_R: System.out.println("你點(diǎn)擊了 R 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "R"); break; case KeyEvent.VK_S: System.out.println("你點(diǎn)擊了 S 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "S"); break; case KeyEvent.VK_T: System.out.println("你點(diǎn)擊了 T 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "T"); break; case KeyEvent.VK_U: System.out.println("你點(diǎn)擊了 U 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "U"); break; case KeyEvent.VK_V: System.out.println("你點(diǎn)擊了 V 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "V"); break; case KeyEvent.VK_W: System.out.println("你點(diǎn)擊了 W 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "W"); break; case KeyEvent.VK_X: System.out.println("你點(diǎn)擊了 X 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "X"); break; case KeyEvent.VK_Y: System.out.println("你點(diǎn)擊了 Y 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Y"); break; case KeyEvent.VK_Z: System.out.println("你點(diǎn)擊了 Z 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "Z"); break; case KeyEvent.VK_SPACE: System.out.println("你點(diǎn)擊了 空格 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "空格"); break; case KeyEvent.VK_ENTER: System.out.println("你點(diǎn)擊了 ENTER 鍵,這個(gè)按鍵的ID為:" + keyCode); addList(keyCode, "回車"); break; default: System.out.println("該按鍵沒(méi)有收錄"); } } }); 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é)
昨天晚上突然跳出的想法,花了點(diǎn)時(shí)間實(shí)現(xiàn)了,雖然界面不太美觀,但是想要的功能都實(shí)現(xiàn)了,感覺(jué)代碼冗余有點(diǎn)多。??赡軙?huì)有梗簡(jiǎn)潔的代碼吧(時(shí)間緊,博客寫的有點(diǎn)匆忙)
到此這篇關(guān)于Java實(shí)現(xiàn)消息轟炸 附帶源碼的文章就介紹到這了,更多相關(guān)java消息轟炸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java concurrency集合之ConcurrentLinkedQueue_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java多線程之ReentrantReadWriteLock源碼解析
- java實(shí)戰(zhàn)之飛機(jī)大戰(zhàn)小游戲(源碼加注釋)
- Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋)
- Java源碼解析之HashMap的put、resize方法詳解
- Java并發(fā)編程之CountDownLatch源碼解析
- 使用Intellij IDEA查看Java源碼技巧
- 徹底了解java中ReentrantLock和AQS的源碼
- Java實(shí)現(xiàn)多人聊天室的原理與源碼
- Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
相關(guān)文章
RestTemplate如何添加請(qǐng)求頭headers和請(qǐng)求體body
這篇文章主要介紹了RestTemplate如何添加請(qǐng)求頭headers和請(qǐng)求體body問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java發(fā)送郵件及打開(kāi)狀態(tài)判斷分析實(shí)例
這篇文章主要為大家介紹了java發(fā)送郵件及打開(kāi)狀態(tài)判斷分析實(shí)例2023-12-12SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java實(shí)現(xiàn)FTP文件與文件夾的上傳和下載
本文主要分享了Java實(shí)現(xiàn)文件上傳和下載的具體實(shí)例,分為單個(gè)文件的上傳與下載和整個(gè)文件夾的上傳與下載。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12Java中數(shù)組與集合的相互轉(zhuǎn)換實(shí)現(xiàn)解析
這篇文章主要介紹了Java中數(shù)組與集合的相互轉(zhuǎn)換實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08