이 기사에서는 Java Network 프로그래밍에서 구현 한 간단한 포트 스캐너에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
컴퓨터 네트워크 연구 에서이 과정에는 많은 단편적인 지식 지점이 있다고 생각할 수는 없습니다. 동시에, 내가 공부 한 교과서는 외국인의 교과서이기 때문에 하향식 방법 이기 때문에 배우기가 어렵습니다. 그러나 외국인의 교과서에서, 나는 특정 수준에서 컴퓨터 네트워크의 지식 시스템을 이해할 수 있으며 그것을 즐깁니다. 동시에 영어 운동을하는 것도 매우 흥미 롭습니다. 모든면에서, 나는 많은 혜택을 얻었고 많은 전문 어휘를 배웠다고 말할 수 있습니다. 클래스 후, 구현 인터페이스가 매우 간단하고 사용할 수있는 캡슐화 된 소켓 클래스가 있기 때문에 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, 90958. 프로그램 구현 원칙은 Java를 사용하여 대상 IP의 지정된 포트에 연결하기 위해 소켓을 설정하는 것입니다. 연결할 수 있다면 포트가 열려 있음을 증명합니다. 반대로 타임 아웃 전에 연결이 없으면 포트가 닫히고 예외가 발생합니다. 동시에 단일 스레드 작업의 효율이 낮은 경우 Java의 멀티 스레드 프로그래밍을 활용하고 대상 호스트의 하나의 포트가 열려 있는지 여부를 멀티 스레드 스캔을 사용합니다. 따라서 최종 디스플레이 결과는 무작위로 표시되며 내부 설정은 최대 10 개의 스레드를 동시에 실행할 수 있다는 것입니다 (실제 상황에 따라 변경 될 수 있음).
사용 된 주요 네트워크 지식은 소켓 사용입니다. Java, Java 인터페이스 설계, 인터페이스 레이아웃 및 간단한 일반 프로그래밍 사용 내부에 컨테이너를 나열합니다.
기본 코드는 다음과 같습니다.
import 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.io exception; import java.net.netaddress; 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.concutorservice; import java.util.util.util.util.util.util 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; javax.swing.jtext whing .jtext whing; javax.swing. / *** 포트 스캔은 메인 프로그램을 시작합니다* / 개인 정적 최종 최종 긴 SerialVersionUid = 1L; 문자열 str1 = "공통 포트는 다음과 같습니다."; 문자열 str2 = "ftp : 21,22, 텔넷 : 23, smtp : 25, http : 80"; 문자열 str3 = "dns : 53, tftp : 69, snmp : 161,162"; 문자열 str4 = "1158,1433,1521,2100,3128,26,69"; 문자열 str5 = "3306,3389,7001,8080,8081,110,143"; 문자열 str6 = "9080,9090,43958,443,465,995,1080"; JBUTTON JB1 = 새로운 JBUTTON ( "Strat"); JtextArea JTA = New JtextArea (); jscrollpane jsp = 새로운 jscrollpane (jta); Jtextfield JTF = New Jtextfield (17); 문자열 IP = ""; // 스캔 할 IP 또는 도메인 이름을 스캔 할 IP 또는 도메인 이름을 스캔 할 수 있습니다 <integer> portlist = new LinkedList <integer> (); // 스캔 된 클러스터 포트 정수를 나타내는 목록 컨테이너를 정의합니다 [] {21, 22, 23, 25, 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}; // 공통 포트 컬렉션 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 ( "스캔 포트"); JTA.SETTABSIZE (4); jta.setfont (New Font ( "Quickkaiti", font.bold, 16)); jta.setlinewrap (true); // 자동 라인 랩 함수를 활성화합니다. // 중복 jb1.addactionListener (new ActionListener () {@override public void actionPerformed (actionEvent e) {// todo auto-auto-void actionperformed (@override public void actionperformed (@override public void actionperformed) {// a auto-voidated method stub = jta.gettext (); // ip, 800)에 입력 한 문자열 (10, 10); 스레드의 스레드는 10}}으로 설정됩니다.); this.set -Visible (true); } / ** * 멀티 스레드 스캔 대상 호스트를위한 지정된 목록 포트 수집 * * @param ip * ip 또는 도메인 이름을 스캔 할 * @param portlist * 스캔 할 포트의 목록 모음 * @param strandnumber * 스레드 수 * 연결 타임 아웃 * / public void scanports (문자열 ip> execute, int 스레드 - 턴어, int timeorser) = executors.newCachedThreadPool (); // (int i = 0; i <ThreadNumber; i ++) {// 10 스레드가 스레드 풀에 추가됩니다 ScanMethod ScanMethod2 = new ScanMethod (IP, Portset, ThreadNumber, I, TimeOut); ThreadPool.Execute (scanmethod2); } threadpool.shutdown (); while (true) {if (threadpool.isterminated ()) {system.out.println ( "scan end"); 부서지다; } try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); }} // end of}/** 스캔 메소드 : 스캔 할 포트 목록 모음을 스캔*/ 개인 클래스 스캔 메드는 runnable {private string ip; // 대상 IP 비공개 목록 <Eteger> 포트리스트; // 스캔 할 포트 모음을 스캔 할 프라이빗 int 스레드 오너, 직렬, 타임 아웃; // 스레드 수는 스레드 수, 시간 초과 공개 ScanMethod (문자열 IP, List <Integer> PortList, int ThreadNumber, int Serial, int timeout) {this.ip = ip; this.portlist = 포트리스트; this.threadnumber = ThreadNumber; this.serial = Serial; this.timeout = 타임 아웃; } public void run () {int port = 0; Integer [] ports = portlist.toArray (new Integer [portlist.size ()]); // 배열에 목록을 시도하십시오 {inetAddress address = inetAddress.getByName (ip); // 호스트 이름을 입력하는 경우 IP 주소 소켓 소켓을 가져 오십시오. // 소켓 SocketAddress SocketAddress를 정의하십시오. // IP 및 포트 If (ports.length <1) // 배열에 요소가없는 경우 return이 실행되지 않습니다. for (port = 0 + serial; port <= ports.length -1; port + = threadNumber) {// 10 스레드는 매번 실행됩니다. 소켓 = new Socket (); // 객체 socketAddress에 메모리 공간을 할당 = 새로운 inetSocketAddress (주소, 포트 [포트]); try {socket.connect (socketaddress, timeout); // 대상 호스트의 지정된 포트를 연결하면 타임 아웃 Socket.close () 후 연결이 실패합니다. // 포트 시스템을 닫습니다. out.println ( "포트" + 포트 [포트] + ": 열기"); JTA.Append ( "포트" + 포트 [포트] + ": Open /n"); // 텍스트 영역에서 메시지를 업데이트} catch (ioException e) {System.out.println ( "port" + port [port] + ": close"); JTA.Append ( "포트" + 포트 [포트] + ": Close /n"); // 포트가 닫혀 있음을 나타내도록 예외가 생성됩니다.}}} catch (unknownHostException e) {e.printstacktrace (); }} // run ()} // scanmethod의 끝 public jpanel getpanel () {jpanel jp = new JPanel (); jp.add (JB1, BorderLayout.Center); jp.setborder (BorderFactory.createraisedBevelborder ()); jp.setbackground (color.lightgray); 반환 jp; } public 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; } 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 ()); // 테칭 경계 반환 jp; } public static void main (String [] args) {new scanport (); }}Java 관련 컨텐츠에 대한 자세한 내용은이 사이트의 주제를 확인하십시오 : "Java Network 프로그래밍 기술 요약", "Java 소켓 프로그래밍 기술 요약", "Java 파일 및 디렉토리 운영 기술 요약", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java Operation Dom Node Skills의 요약"및 "Java Cache 운영 기술 요약"
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.