บทความนี้อธิบายถึงเครื่องสแกนพอร์ตอย่างง่ายที่ดำเนินการโดยการเขียนโปรแกรมเครือข่าย Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
ในการศึกษาเครือข่ายคอมพิวเตอร์ฉันไม่สามารถช่วยได้ แต่รู้สึกว่ามีจุดรู้ที่กระจัดกระจายมากมายในหลักสูตรนี้ ในเวลาเดียวกันเนื่องจากตำราเรียนที่ฉันศึกษาเป็นตำราของชาวต่างชาติ - วิธีการจากบนลงล่าง จึงยากที่จะเรียนรู้ อย่างไรก็ตามจากตำราของชาวต่างชาติฉันสามารถเข้าใจระบบความรู้ของเครือข่ายคอมพิวเตอร์จากระดับหนึ่งและฉันสนุกกับมัน ในขณะเดียวกันการทำแบบฝึกหัดภาษาอังกฤษก็น่าสนใจเช่นกัน จากทุกด้านฉันสามารถพูดได้ว่าฉันได้รับประโยชน์มากมายและเรียนรู้คำศัพท์มืออาชีพมากมาย หลังจากเรียนฉันต้องการสร้างเครื่องสแกนพอร์ตอย่างง่ายซึ่งใช้ใน Java เนื่องจากอินเทอร์เฟซการใช้งานนั้นง่ายมากและยังมีคลาสซ็อกเก็ตห่อหุ้มที่สามารถใช้งานได้ แนวคิดหลักมีดังนี้:
ป้อนชื่อโฮสต์ที่ระบุหรือที่อยู่ IP ในอินเทอร์เฟซโปรแกรมหลักกดปุ่มเริ่มต้นเพื่อสแกนว่าพอร์ตที่ใช้กันทั่วไปของโฮสต์เปิดอยู่หรือไม่ หมายเลขพอร์ตทั่วไปถูกตั้งค่าภายใน: 21, 22, 23, 25, 26, 69, 80, 110, 143, 443, 465, 995, 1080, 1158, 1433, 1521, 2100, 3128, 3306, 3389,7001, 8080, 8081, 9080 หลักการของการใช้งานโปรแกรมคือการใช้ Java เพื่อสร้างซ็อกเก็ตเพื่อเชื่อมต่อกับพอร์ตที่ระบุของ IP เป้าหมาย หากสามารถเชื่อมต่อได้จะพิสูจน์ได้ว่าพอร์ตเปิดอยู่ ในทางตรงกันข้ามหากไม่มีการเชื่อมต่อก่อนหมดเวลาพอร์ตจะปิดและจะมีข้อยกเว้นเกิดขึ้น ในเวลาเดียวกันเมื่อพิจารณาถึงประสิทธิภาพต่ำของการดำเนินการแบบเธรดเดี่ยวมันยังใช้ประโยชน์จากการเขียนโปรแกรมแบบหลายเธรดของ Java และใช้การสแกนแบบหลายเธรดว่าพอร์ตหนึ่งของโฮสต์เป้าหมายเปิดอยู่หรือไม่ ดังนั้นผลลัพธ์การแสดงผลสุดท้ายจะถูกสุ่มและการตั้งค่าภายในคือสามารถทำงานได้มากถึง 10 เธรดในเวลาเดียวกัน (สามารถเปลี่ยนแปลงได้ตามสถานการณ์จริง)
ความรู้เครือข่ายหลักที่ใช้คือการใช้ซ็อกเก็ต เช่นเดียวกับรายการคอนเทนเนอร์ภายใน Java, การออกแบบอินเตอร์เฟส Java, เค้าโครงอินเตอร์เฟสและการใช้การเขียนโปรแกรมทั่วไปอย่างง่าย
รหัสหลักมีดังนี้:
นำเข้า java.awt.borderlayout; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.gridlayout; นำเข้า java.awt.event.actionevent; นำเข้า java.awt.event.ActionListener; java.net.inetsocketaddress; นำเข้า java.net.socketaddress; นำเข้า java.net.unknownhostexception; นำเข้า java.util.arrays; นำเข้า java.util.linkedlist; นำเข้า Java.util.list; java.util.concurrent.executors; นำเข้า Javax.swing.borderfactory; นำเข้า Javax.swing.jbutton; นำเข้า Javax.swing.jframe นำเข้า Javax.swing.jlabel; นำเข้า Javax.swing.jpanel; javax.swing.jtextfield; Scanport ระดับสาธารณะขยาย jFrame { / *** การสแกนพอร์ตเริ่มโปรแกรมหลัก* / ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 1L; String str1 = "พอร์ตทั่วไปคือ:"; string str2 = "ftp: 21,22, telnet: 23, smtp: 25, http: 80"; String str3 = "DNS: 53, TFTP: 69, SNMP: 161,162"; String str4 = "1158,1433,1521,2100,3128,26,69"; String str5 = "3306,3389,7001,8080,8081,110,143"; String str6 = "9080,9090,43958,443,465,995,1080"; JButton JB1 = New JButton ("Strat"); jtextarea jta = new jtextarea (); JScrollpane JSP = new JScrollpane (JTA); jtextfield jtf = new Jtextfield (17); string ip = ""; // ชื่อ IP หรือโดเมนที่จะสแกน <integer> portlist = new LinkedList <integer> (); // กำหนดรายการคอนเทนเนอร์รายการที่แสดงถึงพอร์ตคลัสเตอร์คลัสเตอร์สแกน [] พอร์ต = จำนวนเต็มใหม่ [] {21, 22, 23, 25, 26 465,69,161,162,135,995,1080,1158,1433,1521,2100, 3128, 3306, 3389, 7001, 8080, 8081, 9080, 9090, 43958, 43958 , 135,445,1025,1026,1027,1028,1055,5357}; // การรวบรวมพอร์ตทั่วไป scanport สาธารณะ () {this.add (getPanel (), borderlayout.south); jsp.setBorder (BorderFactory.CreateetChedBorder ()); jsp.setbackground (color.cyan); this.add (jsp, borderlayout.center); this.add (getPanel2 (), Borderlayout.north); this.add (getPanel3 (), BorderLayout.west); this.setbounds (300, 60, 600, 600); this.setDefaultCloseOperation (jframe.exit_on_close); this.settitle ("scanport"); jta.settabsize (4); jta.setfont (ตัวอักษรใหม่ ("Quickkaiti", font.bold, 16)); jta.setLineWrap (จริง); // เปิดใช้งานฟังก์ชั่นการห่อบรรทัดอัตโนมัติ JTA.SetWrapStyleWord (จริง); // เปิดใช้งานฟังก์ชั่นคำศัพท์บรรทัดการทำลายบรรทัด portlist.addall (array.aslist (พอร์ต)); // เพิ่มค่าในพอร์ตเพื่อตั้งค่าและลบ jb1.addactionListener ที่ซ้ำกัน (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {// TODO วิธีการที่สร้างขึ้นอัตโนมัติ (IP TODE) และจำนวนเธรดถูกตั้งค่าเป็น 10}}); this.setVisible (จริง); } / ** * การเปิดตัวของรายการพอร์ตรายการที่ระบุสำหรับโฮสต์เป้าหมายการสแกนแบบมัลติเธรด * * @param ip * ip หรือชื่อโดเมนที่จะสแกน * @param portlist * รายการคอลเลกชันของพอร์ตที่จะสแกน * @param threadnumber * จำนวนเธรด * @param timeout * ExecutorService ThreadPool = Executors.newCachedThreadPool (); // threadpool สำหรับ (int i = 0; i <threadnumber; i ++) {// 10 เธรดจะถูกเพิ่มลงในพูลสระว่ายน้ำ scanmethod scanmethod2 = ใหม่ scanmethod (IP, portset, threadNumber, ฉันหมดเวลา); threadpool.execute (scanmethod2); } threadpool.shutdown (); ในขณะที่ (จริง) {ถ้า (threadpool.isterminated ()) {system.out.println ("สแกนปลาย"); หยุดพัก; } ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); }} // สิ้นสุดในขณะที่}/** วิธีการสแกน: สแกนสำหรับการรวบรวมรายการพอร์ตที่จะสแกน*/ คลาสส่วนตัว scanmethod ใช้งาน runnable {private string ip; // Target IP List Private <teger> portlist; // รายการคอลเลกชันของพอร์ตที่จะสแกน int threadnumber ส่วนตัว, อนุกรม, หมดเวลา; // จำนวนเธรดซึ่งเธรดใดคือจำนวนเธรด, ScanMethod สาธารณะหมดเวลา (สตริง IP, รายการ <treger> portlist, int เธรดนัม, int serial, int หมดเวลา) {this.ip = ip; this.portlist = portlist; this.threadNumber = threadNumber; this.serial = อนุกรม; this.timeout = หมดเวลา; } โมฆะสาธารณะเรียกใช้ () {int port = 0; จำนวนเต็ม [] พอร์ต = portlist.toarray (จำนวนเต็มใหม่ [portlist.size ()]); // list to array ลอง {address inetAddress = inetAddress.getByName (IP); // หากคุณป้อนชื่อโฮสต์ให้ลองรับซ็อกเก็ตซ็อกเก็ตที่อยู่ IP; // กำหนดซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตดเตรท socketaddress; // ผ่าน IP และพอร์ตถ้า (พอร์ตความยาว <1) // หากอาร์เรย์ไม่มีองค์ประกอบการส่งคืนจะไม่ถูกดำเนินการ; สำหรับ (พอร์ต = 0 + อนุกรม; พอร์ต <= พอร์ตความยาว - 1; พอร์ต + = threadNumber) {// 10 เธรดรันแต่ละครั้งซ็อกเก็ต = ซ็อกเก็ตใหม่ (); // จัดสรรพื้นที่หน่วยความจำสำหรับ Object socketAddress = ใหม่ inetSocketAddress (ที่อยู่พอร์ต [พอร์ต]); ลอง {socket.connect (socketaddress, หมดเวลา); // เชื่อมต่อพอร์ตที่ระบุของโฮสต์เป้าหมายและการเชื่อมต่อล้มเหลวหลังจากซ็อกเก็ตหมดเวลา close (); // ปิดพอร์ต System.out.println ("พอร์ต" + พอร์ต [พอร์ต] + ": เปิด"); jta.append ("พอร์ต" + พอร์ต [พอร์ต] + ": open /n"); // อัปเดตข้อความในพื้นที่ข้อความ} catch (ioexception e) {system.out.println ("พอร์ต" + พอร์ต [พอร์ต] + ": ปิด"); jta.append ("พอร์ต" + พอร์ต [พอร์ต] + ": ปิด /n"); // ข้อยกเว้นถูกสร้างขึ้นเพื่อระบุว่าพอร์ตถูกปิด}}} catch (UnknownHostException E) {E.PrintStackTrace (); }} // end of run ()} // end of scanmethod สาธารณะ jpanel getPanel () {jpanel jp = new JPanel (); JP.Add (JB1, BorderLayout.Center); JP.SetBorder (BorderFactory.CreateraisedBevelBorder ()); jp.setBackground (color.lightgray); กลับ JP; } สาธารณะ JPanel getPanel2 () {JPanel JP = new JPanel (); Jlabel JL = new Jlabel (); jl.settext ("โปรดป้อนชื่อโฮสต์หรือที่อยู่ IP และหมายเลขพอร์ตทั่วไปของโฮสต์จะถูกสแกน:"); JP.Add (JL); JP.Add (JTF); JP.SetBorder (BorderFactory.CreateraisedBevelBorder ()); jp.setBackground (color.light_gray); กลับ JP; } สาธารณะ JPanel getPanel3 () {JLabel Jl1 = new JLabel (str1); Jlabel Jl2 = new Jlabel (str2); JLabel JL3 = new JLabel (STR3); Jlabel JL4 = new JLabel (STR4); JLabel JL5 = new JLabel (Str5); Jlabel Jl6 = new Jlabel (Str6); jpanel jp = new jpanel (); jp.setLayout (ใหม่ gridlayout (6, 1)); jp.add (JL1); jp.add (JL2); jp.add (JL3); jp.add (JL4); jp.add (JL5); jp.add (JL6); JP.SetBorder (BorderFactory.CreateetChedBorder ()); // การแกะสลักชายแดนกลับ JP; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {scanport ใหม่ (); -สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Java โปรดตรวจสอบหัวข้อของไซต์นี้: "สรุปทักษะการเขียนโปรแกรมเครือข่าย Java", "บทสรุปของทักษะการเขียนโปรแกรมซ็อกเก็ต Java", "บทสรุปของไฟล์ Java และทักษะการดำเนินงานไดเรกทอรี" การทำงานของ Java Data
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน