Este artigo descreve um simples scanner de porta implementado pela programação da rede Java. Compartilhe -o para sua referência, como segue:
No estudo das redes de computadores, não posso deixar de sentir que existem muitos pontos de conhecimento fragmentários neste curso. Ao mesmo tempo, como os livros didáticos que estudei são os livros de estrangeiros - o método de cima para baixo , é difícil aprender. No entanto, dos livros didáticos dos estrangeiros, posso entender o sistema de conhecimento das redes de computadores de um determinado nível e gosto disso. Ao mesmo tempo, fazer exercícios em inglês também é muito interessante. Em todos os aspectos, posso dizer que me beneficiei muito e aprendi muito vocabulário profissional. Após a aula, eu queria fazer um scanner de porta simples, usado em Java, porque a interface de implementação é muito simples e também existem classes de soquete encapsuladas que podem ser usadas. As principais idéias são as seguintes:
Digite o nome do host especificado ou o endereço IP na interface do programa principal, pressione o botão Iniciar para digitalizar se a porta comumente usada do host está aberta. Os números de portas comuns são definidos 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, 3389.7001, 8080, 8081, 9080, 9090, 9090. O princípio da implementação do programa é usar o Java para estabelecer soquete para se conectar à porta especificada do IP de destino. Se puder ser conectado, prova que a porta está aberta. Pelo contrário, se não houver conexão antes do tempo limite, a porta será fechada e ocorrerá uma exceção. Ao mesmo tempo, considerando a baixa eficiência da operação de thread única, também aproveita a programação multi-thread da Java e usa a varredura com vários threads se uma porta do host de destino está aberta. Portanto, o resultado da exibição final é randomizado e a configuração interna é que até 10 threads podem ser executados ao mesmo tempo (ele pode ser alterado de acordo com a situação real).
O principal conhecimento de rede usado é o uso de soquetes. Bem como listar recipientes dentro do Java, design de interface Java, layout da interface e uso de programação genérica simples.
O código principal é o seguinte:
importar java.awt.borderlayout; importar java.awt.color; importar java.awt.font; importar java.awt.gridlayout; importar java.awt.event.actionEvent; importação java.awt.event.eactionListener; importar java.io.ioException; importação; java.net.iNetSocketAddress; importar java.net.socketAddress; importar java.net.unknownhosception; importar java.util.arrays; importar java.util.linkedlist; importorrSerReRtrice; javax.swing.borderFactory; importar javax.swing.jbutton; importar javax.swing.jframe; importar javax.swing.jlabel; importar javax.swing.jpanel; flastAnTax.swing.jscrollPane; importinging javax.xfield.jtextarea; / *** A varredura da porta inicia o programa principal* / private estático final serialversionuid = 1L; String str1 = "portas comuns são:"; 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 = novo jbutton ("strat"); Jtextarea jta = new jtextarea (); JScrollPane JSP = novo JScrollPane (JTA); JTextfield JTF = New JTextfield (17); String IP = "";//The IP or domain name to be scanned <Integer>portList = new LinkedList<Integer>();// Define a List container that represents the scanned cluster port Integer[] ports = new Integer[] { 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.1055.5357}; // coleção de porta comum 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); // Ative a função de invólucro automático JTA.setWrapStyleword (true); // Ativa a função de palavra que quebra a linha portList.addall (Arrays.aslist (portas)); // Adicione o valor nas portas para definir e remover o JB1.addactionListener duplicado (new ActionListener () {@Override public void ActionPerformed (ActionEvent E) {// TODO Auto-Generated Method STUB IP = JTA.GetText, // IP é o string inserido na caixa de texto; O número de threads é definido como 10}}); this.setVisible (true); } / ** * Abertura da coleção de portas de lista especificada para host de destino de varredura multithread * * * @param ip * ip ou nome de domínio a ser digitalizado * @param portList * coleta de portas para ser digitalizada * @param threadNumber * Número de threads * @param timeout * timeout de conexão * * / public void ScanS (string ips, ip, lists <listar <lister <lister <foum timeout * timeout * * / public void, strings (strac threadpool = executores.newcachedthreadpool (); // threadpool para (int i = 0; i <threadNumber; i ++) {// 10 threads são adicionados ao scanMethod ScanMethod2 = novo scanMethod (IP, portset, threadNumber, i, timeout); threadpool.execute (scanMethod2); } threadpool.shutdown (); while (true) {if (threadpool.isterMined ()) {System.out.println ("scan end"); quebrar; } tente {thread.sleep (1000); } catch (interruptedException e) {e.printStackTrace (); }} // Fim do while}/** Método de varredura: Digitalizar uma coleção de portas de listas a ser digitalizada*/ classe privada ScanMethod que implementa Runnable {private string ip; // Lista privada de IP de destino <Integer> PortList; // Coleção de portas a ser digitalizada private int threadNumber, serial, tempo limite; // Número de threads, que é o número de threads, Timeout Public ScanMethod (String IP, List <Teger> 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 porta = 0; Inteiro [] portas = portList.toArray (novo número inteiro [PortList.size ()]); // Liste para matriz tentar {inetAddress endereço = inetaddress.getbyname (ip); // Se você inserir o nome do host, tente obter o soquete de endereço IP; // Defina soquete soquete soketddress; // Passe IP e Port if (portas.length <1) // Se a matriz não tiver elementos, o retorno não será executado; para (porta = 0 + serial; porta <= portas.length - 1; porta + = threadNumber) {// 10 threads executam cada vez que soquete = new Socket (); // alocar espaço de memória para o objeto soketddress = new inetSocketAddress (endereço, portas [porta]); tente {socket.connect (soketddress, timeout); // conecta a porta especificada do host de destino e a conexão falha após o tempo limite Socket.Close (); // Fechar o port system.out.println ("porta" + portas [porta] + ": aberto"); jta.append ("porta" + portas [porta] + ": aberto /n"); // Atualize a mensagem na área de texto} catch (ioexception e) {System.out.println ("porta" + portas [porta] + ": feche"); jta.append ("porta" + portas [porta] + ": close /n"); // A exceção é gerada para indicar que a porta está fechada}}} catch (desconhecidaHosTexception e) {e.printStackTrace (); }} // end of run ()} // final do scanmethod público jpanel getpanel () {jpanel jp = new jpanel (); jp.add (jb1, borderlayout.center); jp.setborder (borderfactory.createrAisedBevelDorder ()); jp.setbackground (color.lightGray); retornar jp; } public jpanel getPanel2 () {jpanel jp = new jpanel (); Jlabel jl = new jlabel (); jl.settext ("Por favor, insira o nome do host ou o endereço IP, e o número de porta comum do host será digitalizado:"); jp.add (JL); jp.add (JTF); jp.setborder (borderfactory.createrAisedBevelDorder ()); jp.setbackground (color.light_gray); retornar 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 (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 ()); // devolução de borda gravada 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"
Espero que este artigo seja útil para a programação Java de todos.