Cet article décrit un simple scanner de port implémenté par Java Network Programming. Partagez-le pour votre référence, comme suit:
Dans l'étude des réseaux informatiques, je ne peux pas m'empêcher de sentir qu'il existe de nombreux points de connaissance fragmentaires dans ce cours. En même temps, parce que les manuels que j'ai étudiés sont des manuels des étrangers - la méthode descendante , il est difficile à apprendre. Cependant, à partir des manuels des étrangers, je peux comprendre le système de connaissances des réseaux informatiques à partir d'un certain niveau, et je l'apprécie. En même temps, faire des exercices en anglais est également très intéressant. De tous les aspects, je peux dire que j'ai beaucoup profité et appris beaucoup de vocabulaire professionnel. Après le cours, je voulais créer un scanner de port simple, qui a été utilisé dans Java, car l'interface d'implémentation est très simple, et il existe également des classes de socket encapsulées qui peuvent être utilisées. Les principales idées sont les suivantes:
Entrez le nom d'hôte spécifié ou l'adresse IP dans l'interface du programme principal, appuyez sur le bouton Démarrer pour scanner si le port couramment utilisé de l'hôte est ouvert. Les numéros de port communs sont définis en interne: 21, 22, 23, 25, 26, 69, 80, 110, 143, 443, 465, 995, 1080, 1158, 1433, 1521, 2100, 3128, 3306, 3389 7001, 8080, 8100, 9080, 9090, 43958. Le principe de l'implémentation du programme est d'utiliser Java pour établir une prise pour se connecter au port spécifié de l'IP cible. S'il peut être connecté, il prouve que le port est ouvert. Au contraire, s'il n'y a pas de connexion avant le délai d'expiration, le port est fermé et une exception se produira. Dans le même temps, compte tenu de la faible efficacité du fonctionnement unique, il profite également de la programmation multi-thread de Java et utilise un scan multi-thread si un port de l'hôte cible est ouvert. Par conséquent, le résultat de l'affichage final est randomisé, et le paramètre interne est que jusqu'à 10 threads peuvent être exécutés en même temps (il peut être modifié en fonction de la situation réelle).
La principale connaissance du réseau utilisé est l'utilisation de sockets. Ainsi que la liste des conteneurs à l'intérieur de Java, la conception de l'interface Java, la disposition de l'interface et l'utilisation d'une programmation générique simple.
Le code principal est le suivant:
Importer java.awt.borderLayout; import java.awt.color; import java.awt.font; import java.awt.gridlayout; import java.awt.event.actionevent; import java.awt.event.ActionListener; import java.io.ioexception; import java.net.netaddress; import java.net.net.netsadddress; java.net.socketAddress; import java.net.unknownhostException; import java.util.arrays; importer java.util.linkedlist; import java.util.list; import java.util.concurrent.executrservice; import java.util.concurrent.executors; importer javax.swing.borderfactory; import; javax.swing.jbutton; importer javax.swing.jframe; importer javax.swing.jlabel; importer javax.swing.jpanel; importer javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; finale publique Scanport scanport jframe {/ ** * Port SCANT * / Private Scanport Scanport extension Jframe {/ ** * SerialVersionUID = 1L; String str1 = "Les ports communs sont:"; 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 = nouveau JBUTTON ("Strat"); JTextArea jta = new jTextArea (); Jscrollpane jsp = new jscrollpane (JTA); JTextfield jtf = new JTextfield (17); String ip = ""; // Le nom de domaine IP ou de domaine à analyser <Integer> portlist = new LinkedList <Integer> (); // Définir un conteneur de liste qui représente le port de cluster numérisé entier [] ports = nouveau entier [] {21, 22, 23, 25, 26, 53,69, 80, 110, 143, 443, 465,69,161,162,135,995,1080,1158,1433,1521,2100, 3128, 3306, 3389, 7001, 8080, 8081, 9080, 9090, 43958 , 135 445,1025,1026,1027,1028 105 5357}; // Common Collection de port public 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 (New Font ("Quickkaiti", Font.Bold, 16)); jta.setlinewrap (true); // activer la fonction de wrap de ligne automatique jta.setwrapstyleword (true); // activer la fonction de mot de ligne portlistList.addall (arrays.aslist (ports)); // Ajouter la valeur dans les ports pour définir et supprimer le duplicate jb1.addactionListener (new ActionListener () {@Override public void ActionperFormed (ActionEvent e) {// TODO est la méthode générée automatiquement Stub IP = JTA.GetText (); // IP est la chaîne entrée dans la zone de texte Scanports (IP, PortList, 10, 800); défini sur 10}}); this.setVisible (true); } / ** * Ouverture de la collection de ports de liste spécifiée pour l'hôte cible d'analyse multithread * * @param ip * ip ou nom de domaine à numériser * @param portlist * liste de la liste de ports à analyser * @param threadNumber * nombre de threads * @param timeout * Connection Timeout * * / public void scanports (String ip, list <Integer> portset, portset, intrikeNumber internuln ThreadPool = exécuteurs.NewCachedThreadPool (); // Threadpool pour (int i = 0; i <threadNumber; i ++) {// 10 threads sont ajoutés au thread pool scanMethod ScanMethod2 = new ScanMethod (ip, portset, threadNumber, i, timeout); Threadpool.Exécute (ScanMethod2); } threadpool.shutdown (); while (true) {if (threadpool.isterMined ()) {System.out.println ("Scan End"); casser; } essayez {Thread.Sleep (1000); } catch (InterruptedException e) {e.printStackTrace (); }} // Fin de While} / * * Méthode de numérisation: Analyser une liste de liste de ports à analyser * / classe privée ScanMethod implémente Runnable {private String ip; // cible la liste privée IP <Integer> portlist; // Liste de la collection de ports à numériser private int threadNumber, série, délai d'expiration; // Nombre de threads, quel thread est le nombre de threads, Timeout public ScanMethod (String ip, list <Integer> portlist, int threadNumber, int serial, int timeout) {this.ip = ip; this.portList = portlist; this.threadnumber = threadNumber; this.serial = serial; this.timeout = timeout; } public void run () {int port = 0; Entier [] ports = portlist.toArray (nouvel entier [portlist.size ()]); // Liste pour array essai {InetAddress Address = InetAddress.getByName (ip); // Si vous entrez le nom de l'hôte, essayez d'obtenir la prise de socket d'adresse IP; // Définissez socket socketaddress socketaddress; // passer ip et port if (ports.length <1) // Si le tableau n'a aucun éléments, retour ne sera pas exécuté; pour (port = 0 + serial; port <= ports.length - 1; port + = threadNumber) {// 10 threads exécutent chaque socket = new socket (); // allouer l'espace mémoire pour l'objet socketAddress = new IneTsocketDdress (adresse, ports [port]); essayez {socket.connect (socketaddress, timeout); // Connectez le port spécifié de l'hôte cible et la connexion échoue après le temps mort.Close (); // Fermez le port System.out.println ("port" + ports [port] + ": ouvrir"); jta.append ("port" + ports [port] + ": open / n"); // Mette à jour le message dans la zone de texte} catch (ioException e) {System.out.println ("port" + ports [port] + ": close"); jta.append ("port" + ports [port] + ": close / n"); // L'exception est générée pour indiquer que le port est fermé}}} catch (UnknownHostException e) {e.printStackTrace (); }} // fin de run ()} // fin de ScanMethod public jpanel getPanel () {jpanel jp = new jpanel (); JP.Add (JB1, BorderLayout.Center); jp.setborder (borderfactory.crearesesedbevelborder ()); jp.setbackground (Color.lightgray); retourner jp; } public jpanel getPanel2 () {jpanel jp = new JPanel (); JLabel jl = new JLabel (); JL.SETTEXT ("Veuillez saisir le nom d'hôte ou l'adresse IP, et le numéro de port commun de l'hôte sera analysé:"); jp.add (jl); JP.Add (JTF); jp.setborder (borderfactory.crearesesedbevelborder ()); jp.setbackground (colore.light_gray); retourner jp; } public jpanel getPanel3 () {jLabel jl1 = new JLabel (str1); JLABEL JL2 = NOUVEAU JLABEL (STR2); JLABEL JL3 = New JLabel (STR3); JLABEL JL4 = NOUVEAU JLABEL (STR4); JLABEL JL5 = NOUVEAU JLABEL (STR5); JLABEL JL6 = NOUVEAU JLABEL (STR6); Jpanel jp = new JPanel (); jp.setLayout (new 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 ()); // gravure de la bordure retour jp; } public static void main (String [] args) {new scanport (); }}For more information about Java related content, please check out the topics of this site: "Summary of Java Network Programming Skills", "Summary of Java Socket Programming Skills", "Summary of Java File and Directory Operation Skills", "Tutorial on Java Data Structure and Algorithm", "Summary of Java Operation DOM Node Skills" and "Summary of Java Cache Operation Skills"
J'espère que cet article sera utile à la programmation Java de tous.