日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲逼院 | 新91视频在线观看 | 在线观看亚洲一区 | 亚洲色欧美另类 | 精品国产一区一区二区三亚瑟 | 午夜成人免费视频 | 亚洲一区二区三区观看 | 奇米四色在线视频 | 日韩视频免费观看高清 | 综合伊人久久 | 久草资源福利 | 日韩熟妇一区二区三区 | 九色国产视频 | 欧美精品日韩在线观看 | 久国久产久精永久网页 | 性调教学院高h学校 | 蝌蚪av| 天天操狠狠干 | 亚洲专区免费 | 国产精品久久一区 | 欧美日日操 | 国产又色又爽 | 蜜桃视频免费网站 | 91日日夜夜 | 日日夜夜2017| 国产一级黄色av | 国产一级片自拍 | 日本精品中文字幕 | 国产精品伦子伦免费视频 | 被黑人啪到哭的番号922在线 | 激情xxx| 91欧美日韩麻豆精品 | 欧美视频在线不卡 | 久久免费电影 | 国产麻豆剧果冻传媒白晶晶 | 台湾av在线播放 | 成人av色 | 那里有毛片看 | 精品国产视频一区二区三区 | 99精品在线观看 | 一区二区三区精品久久久 | 香蕉视频亚洲一级 | av午夜影院 | √天堂资源地址在线官网 | 国产sm主人调教女m视频 | 美女羞羞动态图 | 在线免费看黄网站 | 成人黄色视屏 | 久久人人爽人人爽人人 | 粉豆av| 国产在线视频自拍 | 天天射天天射 | 国产黄色高清 | 日韩免费在线 | 中文理论片 | 夜夜骑av | 999精品视频在线观看 | 久久国产精品国语对白 | 国产99免费 | 免费看成人av | 一区二区三区欧美日韩 | 成人毛片18女人毛片 | 女生喷水视频 | 欧美性网址 | 在线观看wwww | 欧美激情va永久在线播放 | 丁香婷婷六月天 | 亚洲av电影一区二区 | 国产精品91视频 | jlzzjlzzjlzz亚洲人 | 一区二区不卡 | 噜噜噜久久,亚洲精品国产品 | 男女搞鸡网站 | 黄视频免费看在线 | 99热com| 日韩欧美黄色网址 | 日产精品一区 | 尤物193.com| 欧美丰满艳妇bbwbbw | 欧美综合精品 | 在线播放你懂得 | 欧美性大战久久久久久 | 封神榜二在线高清免费观看 | 成人xxxx| av伊人久久| 一女二男一黄一片 | 日韩在线观看中文字幕 | 欧美成人aaa片一区国产精品 | 欧美日韩免费一区 | 欧美黄色录像 | 韩国伦理在线看 | 一区二区三区黄 | 国产免费一区二区视频 | 日本色呦呦 | 香蕉在线视频播放 | 美女扒开大腿让男人桶 | 视频免费在线观看 | 亚洲精品20p | 亚洲爱 |