日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java多线程实现端口扫描,使用Java开发多线程端口扫描工具

發(fā)布時(shí)間:2024/10/12 java 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程实现端口扫描,使用Java开发多线程端口扫描工具 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:這里只給出命令行版的掃描工具,后續(xù)可能是寫一個(gè)獨(dú)立的界面,或者是集成到其他工具上去。

一 掃描原理

其實(shí)原理非常簡單,就是使用Socket去連接目標(biāo)IP或者域名的指定端口,如果能夠連上則說明該端口是打開的。反之,要是在連接超時(shí)之前都沒有連上,則將該端口判斷為關(guān)閉狀態(tài)。下面我將分別說明兩種基本的掃描方式:(1)掃描一個(gè)連續(xù)的端口段;(2)僅掃描一個(gè)指定的端口集合

二 使用多線程掃描目標(biāo)主機(jī)一個(gè)段的端口開放情況

/**

* 多線程掃描目標(biāo)主機(jī)一個(gè)段的端口開放情況

*

* @param ip

* 待掃描IP或域名,eg:180.97.161.184 www.zifangsky.cn

* @param startPort

* 起始端口

* @param endPort

* 結(jié)束端口

* @param threadNumber

* 線程數(shù)

* @param timeout

* 連接超時(shí)時(shí)間

* */

public void scanLargePorts(String ip, int startPort, int endPort,

int threadNumber, int timeout) {

ExecutorService threadPool = Executors.newCachedThreadPool();

for (int i = 0; i < threadNumber; i++) {

ScanMethod1 scanMethod1 = new ScanMethod1(ip, startPort, endPort,

threadNumber, i, timeout);

threadPool.execute(scanMethod1);

}

threadPool.shutdown();

// 每秒中查看一次是否已經(jīng)掃描結(jié)束

while (true) {

if (threadPool.isTerminated()) {

System.out.println("掃描結(jié)束");

break;

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36/**

* 多線程掃描目標(biāo)主機(jī)一個(gè)段的端口開放情況

*

* @param ip

*????????????待掃描IP或域名,eg:180.97.161.184 www.zifangsky.cn

* @param startPort

*????????????起始端口

* @param endPort

*????????????結(jié)束端口

* @param threadNumber

*????????????線程數(shù)

* @param timeout

*????????????連接超時(shí)時(shí)間

* */

publicvoidscanLargePorts(Stringip,intstartPort,intendPort,

intthreadNumber,inttimeout){

ExecutorServicethreadPool=Executors.newCachedThreadPool();

for(inti=0;i

ScanMethod1scanMethod1=newScanMethod1(ip,startPort,endPort,

threadNumber,i,timeout);

threadPool.execute(scanMethod1);

}

threadPool.shutdown();

// 每秒中查看一次是否已經(jīng)掃描結(jié)束

while(true){

if(threadPool.isTerminated()){

System.out.println("掃描結(jié)束");

break;

}

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

然后是一個(gè)內(nèi)部類ScanMethod1實(shí)現(xiàn)了Runnable接口:

/**

* 掃描方式一:針對(duì)起始結(jié)束端口,進(jìn)行逐個(gè)掃描

*

* */

class ScanMethod1 implements Runnable {

private String ip; // 目標(biāo)IP

private int startPort, endPort, threadNumber, serial, timeout; // 起始和結(jié)束端口,線程數(shù),這是第幾個(gè)線程,超時(shí)時(shí)間

/**

* 初始化

*

* @param ip

* 待掃描IP或域名

* @param startPort

* 起始端口

* @param endPort

* 結(jié)束端口

* @param threadNumber

* 線程數(shù)

* @param serial

* 標(biāo)記是第幾個(gè)線程

* @param timeout

* 連接超時(shí)時(shí)間

* */

public ScanMethod1(String ip, int startPort, int endPort,

int threadNumber, int serial, int timeout) {

this.ip = ip;

this.startPort = startPort;

this.endPort = endPort;

this.threadNumber = threadNumber;

this.serial = serial;

this.timeout = timeout;

}

public void run() {

int port = 0;

try {

InetAddress address = InetAddress.getByName(ip);

Socket socket;

SocketAddress socketAddress;

for (port = startPort + serial; port <= endPort; port += threadNumber) {

socket = new Socket();

socketAddress = new InetSocketAddress(address, port);

try {

socket.connect(socketAddress, timeout); // 超時(shí)時(shí)間

socket.close();

System.out.println("端口 " + port + " :開放");

} catch (IOException e) {

// System.out.println("端口 " + port + " :關(guān)閉");

}

}

} catch (UnknownHostException e) {

e.printStackTrace();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57/**

* 掃描方式一:針對(duì)起始結(jié)束端口,進(jìn)行逐個(gè)掃描

*

* */

classScanMethod1implementsRunnable{

privateStringip;// 目標(biāo)IP

privateintstartPort,endPort,threadNumber,serial,timeout;// 起始和結(jié)束端口,線程數(shù),這是第幾個(gè)線程,超時(shí)時(shí)間

/**

* 初始化

*

* @param ip

*????????????待掃描IP或域名

* @param startPort

*????????????起始端口

* @param endPort

*????????????結(jié)束端口

* @param threadNumber

*????????????線程數(shù)

* @param serial

*????????????標(biāo)記是第幾個(gè)線程

* @param timeout

*????????????連接超時(shí)時(shí)間

* */

publicScanMethod1(Stringip,intstartPort,intendPort,

intthreadNumber,intserial,inttimeout){

this.ip=ip;

this.startPort=startPort;

this.endPort=endPort;

this.threadNumber=threadNumber;

this.serial=serial;

this.timeout=timeout;

}

publicvoidrun(){

intport=0;

try{

InetAddressaddress=InetAddress.getByName(ip);

Socketsocket;

SocketAddresssocketAddress;

for(port=startPort+serial;port<=endPort;port+=threadNumber){

socket=newSocket();

socketAddress=newInetSocketAddress(address,port);

try{

socket.connect(socketAddress,timeout);// 超時(shí)時(shí)間

socket.close();

System.out.println("端口 "+port+" :開放");

}catch(IOExceptione){

// System.out.println("端口 " + port + " :關(guān)閉");

}

}

}catch(UnknownHostExceptione){

e.printStackTrace();

}

}

}

三 使用多線程掃描目標(biāo)主機(jī)指定Set端口集合的開放情況

/**

* 多線程掃描目標(biāo)主機(jī)指定Set端口集合的開放情況

*

* @param ip

* 待掃描IP或域名,eg:180.97.161.184 www.zifangsky.cn

* @param portSet

* 待掃描的端口的Set集合

* @param threadNumber

* 線程數(shù)

* @param timeout

* 連接超時(shí)時(shí)間

* */

public void scanLargePorts(String ip, Set portSet,

int threadNumber, int timeout) {

ExecutorService threadPool = Executors.newCachedThreadPool();

for (int i = 0; i < threadNumber; i++) {

ScanMethod2 scanMethod2 = new ScanMethod2(ip, portSet,

threadNumber, i, timeout);

threadPool.execute(scanMethod2);

}

threadPool.shutdown();

while (true) {

if (threadPool.isTerminated()) {

System.out.println("掃描結(jié)束");

break;

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33/**

* 多線程掃描目標(biāo)主機(jī)指定Set端口集合的開放情況

*

* @param ip

*????????????待掃描IP或域名,eg:180.97.161.184 www.zifangsky.cn

* @param portSet

*????????????待掃描的端口的Set集合

* @param threadNumber

*????????????線程數(shù)

* @param timeout

*????????????連接超時(shí)時(shí)間

* */

publicvoidscanLargePorts(Stringip,SetportSet,

intthreadNumber,inttimeout){

ExecutorServicethreadPool=Executors.newCachedThreadPool();

for(inti=0;i

ScanMethod2scanMethod2=newScanMethod2(ip,portSet,

threadNumber,i,timeout);

threadPool.execute(scanMethod2);

}

threadPool.shutdown();

while(true){

if(threadPool.isTerminated()){

System.out.println("掃描結(jié)束");

break;

}

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

具體的線程內(nèi)部類跟上面類似,代碼如下:

/**

* 掃描方式二:針對(duì)一個(gè)待掃描的端口的Set集合進(jìn)行掃描

*

* */

private class ScanMethod2 implements Runnable {

private String ip; // 目標(biāo)IP

private Set portSet; // 待掃描的端口的Set集合

private int threadNumber, serial, timeout; // 線程數(shù),這是第幾個(gè)線程,超時(shí)時(shí)間

public ScanMethod2(String ip, Set portSet, int threadNumber,

int serial, int timeout) {

this.ip = ip;

this.portSet = portSet;

this.threadNumber = threadNumber;

this.serial = serial;

this.timeout = timeout;

}

public void run() {

int port = 0;

Integer[] ports = portSet.toArray(new Integer[portSet.size()]); // Set轉(zhuǎn)數(shù)組

try {

InetAddress address = InetAddress.getByName(ip);

Socket socket;

SocketAddress socketAddress;

if (ports.length < 1)

return;

for (port = 0 + serial; port <= ports.length - 1; port += threadNumber) {

socket = new Socket();

socketAddress = new InetSocketAddress(address, ports[port]);

try {

socket.connect(socketAddress, timeout);

socket.close();

System.out.println("端口 " + ports[port] + " :開放");

} catch (IOException e) {

// System.out.println("端口 " + ports[port] + " :關(guān)閉");

}

}

} catch (UnknownHostException e) {

e.printStackTrace();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45/**

* 掃描方式二:針對(duì)一個(gè)待掃描的端口的Set集合進(jìn)行掃描

*

* */

privateclassScanMethod2implementsRunnable{

privateStringip;// 目標(biāo)IP

privateSetportSet;// 待掃描的端口的Set集合

privateintthreadNumber,serial,timeout;// 線程數(shù),這是第幾個(gè)線程,超時(shí)時(shí)間

publicScanMethod2(Stringip,SetportSet,intthreadNumber,

intserial,inttimeout){

this.ip=ip;

this.portSet=portSet;

this.threadNumber=threadNumber;

this.serial=serial;

this.timeout=timeout;

}

publicvoidrun(){

intport=0;

Integer[]ports=portSet.toArray(newInteger[portSet.size()]);// Set轉(zhuǎn)數(shù)組

try{

InetAddressaddress=InetAddress.getByName(ip);

Socketsocket;

SocketAddresssocketAddress;

if(ports.length<1)

return;

for(port=0+serial;port<=ports.length-1;port+=threadNumber){

socket=newSocket();

socketAddress=newInetSocketAddress(address,ports[port]);

try{

socket.connect(socketAddress,timeout);

socket.close();

System.out.println("端口 "+ports[port]+" :開放");

}catch(IOExceptione){

// System.out.println("端口 " + ports[port] + " :關(guān)閉");

}

}

}catch(UnknownHostExceptione){

e.printStackTrace();

}

}

}

四兩種掃描方式的測(cè)試用例

public static void main(String[] args) {

PortScanDemo portScanDemo = new PortScanDemo();

//方式1

// portScanDemo.scanLargePorts("ultra-book.co", 20, 10000, 5,800);

// portScanDemo.scanLargePorts("180.97.161.184", 1, 100, 5);

//方式2

Set portSet = new LinkedHashSet();

Integer[] ports = new Integer[] { 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};

portSet.addAll(Arrays.asList(ports));

portScanDemo.scanLargePorts("ultra-book.co", portSet, 5, 800);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15publicstaticvoidmain(String[]args){

PortScanDemoportScanDemo=newPortScanDemo();

//方式1

// portScanDemo.scanLargePorts("ultra-book.co", 20, 10000, 5,800);

// portScanDemo.scanLargePorts("180.97.161.184", 1, 100, 5);

//方式2

SetportSet=newLinkedHashSet();

Integer[]ports=newInteger[]{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};

portSet.addAll(Arrays.asList(ports));

portScanDemo.scanLargePorts("ultra-book.co",portSet,5,800);

}

五測(cè)試結(jié)果

注:1 超時(shí)時(shí)間是以毫秒為單位,其中要是掃描國內(nèi)的IP可以把這個(gè)時(shí)間適當(dāng)設(shè)置低一點(diǎn),200~500左右。相反,要是掃描國外IP就需要把這個(gè)時(shí)間適當(dāng)設(shè)置大一點(diǎn),不然有可能把本來打開的端口也漏掉了

總結(jié)

以上是生活随笔為你收集整理的java多线程实现端口扫描,使用Java开发多线程端口扫描工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.亚洲精品 | 国产精久久久 | 天天干,天天操,天天射 | 精产国品一二三区 | 123毛片| 成人在线视频免费观看 | 奇米网在线观看 | 日本免费无人高清 | 奇米网7777 | 欧美日韩免费一区 | 亚洲女同女同女同女同女同69 | 992av| 免费观看av网址 | 精品伦理一区二区 | 私密spa按摩按到高潮 | 30一40一50老女人毛片 | 中文资源在线观看 | 久久久亚洲一区二区三区 | 中国吞精videos露脸 | 99re6热在线精品视频播放 | www黄色com| 涩涩五月天| 日中文字幕 | 成人影视网址 | 91视频导航 | 国产在线播放一区二区 | 一本色道久久综合亚洲精品酒店 | 伊人91视频| 91在线不卡| 久久国产精品免费观看 | 精品人妻一区二区三区日产乱码卜 | 国产一区二区亚洲 | 97视频在线观看免费高清完整版在线观看 | 欧美久久视频 | 亚洲狼人伊人 | 日本久色| 欧美乱轮视频 | 欧日韩不卡在线视频 | 26uuu精品一区二区在线观看 | 国产精品久久久久野外 | 欧美一区二区性久久久 | 欧美视频在线观看一区二区 | 精品少妇一区二区三区 | 国产宾馆实践打屁股91 | 久久综合免费视频 | 亚洲在线观看免费 | 中文字幕一区二区人妻在线不卡 | 成年人天堂 | 高清在线一区二区 | 成人做爰69片免费看 | 波多野结衣一区二区在线 | 日日夜夜国产精品 | 美女av免费在线观看 | 女人囗交吞精囗述 | 国产高潮av | 玖玖爱免费视频 | 亚洲伦理自拍 | 日本高清视频一区二区三区 | 波多野结衣中文字幕在线 | 午夜毛片电影 | 合欢视频污 | 国产精品揄拍100视频 | 中国黄色a级片 | 国产欧美日韩精品在线观看 | 91精品人妻一区二区三区蜜桃2 | 男阳茎进女阳道视频大全 | 真性中出 | 久久神马 | 干干干操操操 | mm1313亚洲国产精品无码试看 | 欧美z○zo重口另类黄 | 天堂视频一区二区 | 在线观看免费av片 | 亚洲欧美日韩综合在线 | 爱爱一区 | 深夜老司机福利 | 亚洲一区二区人妻 | 永久免费在线播放 | 一区二区三区天堂 | 久草视频免费播放 | 少妇视频在线观看 | 香蕉视频官网 | av合集 | 成人性毛片 | 成人久久| xxxxx日韩| 欧美性久久久 | 欧美乱大交xxxxx春色视频 | 秋霞99 | 免费一级大片 | 国产美女裸体无遮挡免费视频 | 91视频最新入口 | 光明影院手机版在线观看免费 | 国产成人一区二区在线 | 国产成人在线播放 | 欧美精品色呦呦 | 国产普通话bbwbbwbbw | 无码人妻精品一区二区三区不卡 | 欧美体内she精高潮 日韩一区免费 |