Este artículo describe un escáner de puerto simple implementado por Java Network Programming. Compártelo para su referencia, como sigue:
En el estudio de las redes informáticas, no puedo evitar sentir que hay muchos puntos de conocimiento fragmentarios en este curso. Al mismo tiempo, debido a que los libros de texto que estudié son libros de texto de extranjeros, el método de arriba hacia abajo , es difícil de aprender. Sin embargo, desde los libros de texto de los extranjeros, puedo entender el sistema de conocimiento de las redes informáticas desde un cierto nivel, y lo disfruto. Al mismo tiempo, hacer ejercicios en inglés también es muy interesante. Desde todos los aspectos, puedo decir que he beneficiado mucho y he aprendido mucho vocabulario profesional. Después de la clase, quería hacer un escáner de puerto simple, que se usó en Java, porque la interfaz de implementación es muy simple y también hay clases de socket encapsuladas que se pueden usar. Las ideas principales son las siguientes:
Ingrese el nombre de host especificado o la dirección IP en la interfaz principal del programa, presione el botón Inicio para escanear si el puerto comúnmente utilizado del host está abierto. Los números de puertos comunes se establecen internamente: 21, 22, 23, 25, 26, 69, 80, 110, 143, 443, 465, 995, 1080, 1158, 1433, 1521, 2100, 3128, 3306, 3389,7001, 8080, 8081, 9080, 9090, 43958. También puede modificarse usted mismo. El principio de implementación del programa es usar Java para establecer el socket para conectarse al puerto especificado de la IP de destino. Si se puede conectar, demuestra que el puerto está abierto. Por el contrario, si no hay conexión antes del tiempo de espera, el puerto está cerrado y ocurrirá una excepción. Al mismo tiempo, teniendo en cuenta la baja eficiencia de la operación de un solo subproceso, también aprovecha la programación de múltiples subprocesos de Java, y utiliza escaneo de múltiples subprocesos si un puerto del host de destino está abierto. Por lo tanto, el resultado final de la pantalla es aleatorizado, y la configuración interna es que hasta 10 subprocesos se pueden ejecutar al mismo tiempo (se puede cambiar de acuerdo con la situación real).
El conocimiento principal de la red utilizado es el uso de enchufes. Además de enumerar los contenedores dentro de Java, el diseño de la interfaz Java, el diseño de la interfaz y el uso de programación genérica simple.
El código principal es el siguiente:
import java.awt.bordayout; 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.inetaddress; import; importar; importar; importar; import java.net.inetsocketaddress; import java.net.socketaddress; import java.net.unknownhostexception; import java.util.arrays; import java.util.linkedList; import java.util.list; import java.util.concurrent.executorservice; import java.utilutil. javax.swing.borderFactory; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; públicas clases escaneados { / *** El escaneo de puertos comienza el programa principal* / privado estático final Long SerialVersionUid = 1L; Cadena str1 = "Los puertos comunes son:"; Cadena str2 = "ftp: 21,22, telnet: 23, smtp: 25, http: 80"; Cadena str3 = "dns: 53, tftp: 69, snmp: 161,162"; Cadena str4 = "1158,1433,1521,2100,3128,26,69"; Cadena str5 = "3306,3389,7001,8080,8081,110,143"; Cadena 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 = ""; // El nombre IP o dominio se escaneará <integer> portList = new LinkedList <integer> (); // Defina un contenedor de lista que represente el entero del puerto de clúster escaneado [] puertos = nuevo entero [] {21, 22, 23, 25, 26, 53,69, 80, 110, 143, 443, 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,1055,5357}; // Common Port Collection Public scanPort () {this.add (getPanel (), borderLayout.South); JSP.SetBorder (BorderFactory.CreateEteChedBorder ()); 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 ("escaneo"); jta.settabsize (4); JTA.SetFont (nueva fuente ("QuickKaiti", Font.Bold, 16)); JTA.SetLineWrap (true); // Active la función de envoltura de línea automática JTA.SetWrapStyleword (true); // Active la función de palabras que ruye por línea PortList.addall (arrays.aslist (puertos)); // Agregue el valor en los puertos para establecer y eliminar el duplicado jb1.addactionListener (new ActionListener () {@Override public void ActionperFormed (ActionEvent E) {// TODO Método Generado Automerso stub IP = JTA.GETTEXT (); // IP es la cadena ingresada en el cuadro de textos (IP, PortList, 10, 800); 800, el número de hilos se establece en 10}}); this.setVisible (verdadero); } / ** * Apertura de la colección de puertos de lista especificada para el host de destino de escaneo multithreaded * * * @param ip * ip o nombre de dominio para escanear * @param portlist * Lista de la colección de puertos para escanear * @param threadnumber * número de hilos * @param timeout * conection * * / public void scanports (string ip, list <integer> puertset, intitsing tumber, @param timeout * de conexión * * / public threadpool = ejecutors.newCachedThreadPool (); // Threadpool para (int i = 0; i <threadnumber; i ++) {// se agregan 10 hilos al grupo de hilos scanmethod scanmethod2 = new ScanMethod (IP, Portset, ThreadNumber, I, TIMeOut); threadpool.execute (scanmethod2); } threadpool.shutdown (); while (true) {if (threadpool.istermined ()) {system.out.println ("escanear final"); romper; } try {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); }} // end de while}/** Método de escaneo: escanee para obtener una colección de la lista de puertos que se escanee*/ private class scanmethod implementa runnable {private string ip; // Target IP Lista privada <integer> PortList; // Enumere la colección de puertos que se escaneará en privado int threadnumber, serial, tiempo de espera; // Número de subprocesos, que es el número de hilos, Tiempo de espera 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 = Tiempo de espera; } public void run () {int port = 0; Entero [] ports = portList.toArray (nuevo entero [portList.Size ()]); // Listar a array inty {inetAddress dirección = inetaddress.getByName (ip); // Si ingresa el nombre de host, intente obtener el socket de Socket de dirección IP; // Defina Socket SocketAddress SocketAddress; // pase IP y puerto if (port.length <1) // Si la matriz no tiene elementos, la retorno no se ejecutará; for (puerto = 0 + serial; puerto <= port.length - 1; puert + = threadnumber) {// 10 subprocesos se ejecutan cada vez que seque = new Socket (); // Asignar espacio de memoria para el objeto SocketAddress = new InetSocketAddress (dirección, puertos [puerto]); intente {Socket.Connect (SocketAddress, TimeOut); // Conecte el puerto especificado del host de destino, y la conexión falla después del tiempo de espera Socket.close (); // Cierre el puerto System.out.println ("Port" + Ports [Port] + ": Open"); JTA.Append ("Puerto" + Puertos [Puerto] + ": Open /N"); // Actualizar el mensaje en el área de texto} Catch (ioException E) {System.out.println ("Port" + Ports [Port] + ": Close"); jta.append ("puerto" + puertos [puerto] + ": cerrar /n"); // La excepción se genera para indicar que el puerto está cerrado}}} Catch (desconocidoHosTexception e) {E.PrintStackTrace (); }} // end de run ()} // end de scanmethod public jpanel getPanel () {jpanel jp = new jpanel (); JP.Add (JB1, BorderLayout.Center); JP.SetBorder (BorderFactory.CreaterAisedBevelBorder ()); jp.setbackground (color.lightgray); regresar jp; } public jpanel getPanel2 () {jpanel jp = new jPanel (); Jlabel jl = new JLabel (); jl.setText ("Ingrese el nombre del host o la dirección IP, y el número de puerto común del host será escaneado:"); JP.Add (JL); JP.Add (JTF); JP.SetBorder (BorderFactory.CreaterAisedBevelBorder ()); jp.setbackground (color.light_gray); regresar jp; } public 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 (nuevo GridLayout (6, 1)); JP.Add (JL1); JP.Add (JL2); JP.Add (JL3); JP.Add (JL4); JP.Add (JL5); JP.Add (JL6); JP.SetBorder (BorderFactory.CreateEteChedBorder ()); // Retorno de la frontera de grabado JP; } public static void main (string [] args) {new scanPort (); }}Para obtener más información sobre el contenido relacionado con Java, consulte los temas de este sitio: "Resumen de las habilidades de programación de redes de Java", "Resumen de las habilidades de programación de socket de Java", "Resumen de Java Archivo y Habilidades de operación de directorio", "Tutorial sobre la estructura de datos de Java y algoritmo", "Resumen de las habilidades de operación de Java Dom" y "Summary of Java COMERACIÓN COMINACIÓN CABACHA" Habilidades ""
Espero que este artículo sea útil para la programación Java de todos.