forked from KNEMC/KLALB
优化代码,性能暴涨
This commit is contained in:
@@ -25,10 +25,14 @@ public class InetAddressRange {
|
||||
this.end = end;
|
||||
}
|
||||
public String getBeginHost() {
|
||||
if(beginHost!=null)
|
||||
return beginHost;
|
||||
return begin.getHostAddress();
|
||||
}
|
||||
public String getEndHost() {
|
||||
if(endHost!=null)
|
||||
return endHost;
|
||||
return end.getHostAddress();
|
||||
}
|
||||
public InetAddressRange(InetAddress address) {
|
||||
this(address,address);
|
||||
|
||||
@@ -28,7 +28,7 @@ public class PortRange {
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PortRange [begin=" + begin + ", end=" + end + "]";
|
||||
return begin + "~" + end ;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package org.kne.cloud.network.scanner;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
|
||||
public class ScanRange implements Serializable {
|
||||
public ScanRange(String range) throws UnknownHostException {
|
||||
setMsaString(range);
|
||||
}
|
||||
protected void setMsaString(String range) throws UnknownHostException {
|
||||
String[]sp=range.split("~");
|
||||
MultipurposeSocketAddress begin=new MultipurposeSocketAddress(sp[0]);
|
||||
MultipurposeSocketAddress end;
|
||||
if(sp.length>1) {
|
||||
end=new MultipurposeSocketAddress(sp[1]);
|
||||
}else {
|
||||
end=new MultipurposeSocketAddress(sp[0]);
|
||||
}
|
||||
setMsa(begin, end);
|
||||
}
|
||||
public ScanRange(MultipurposeSocketAddress begin,MultipurposeSocketAddress end) throws UnknownHostException {
|
||||
setMsa(begin,end);
|
||||
|
||||
}
|
||||
|
||||
protected void setMsa(MultipurposeSocketAddress begin, MultipurposeSocketAddress end) throws UnknownHostException {
|
||||
this.addressRange=new InetAddressRange(begin.getHost(), end.getHost());
|
||||
this.portRange=new PortRange(begin.getPort(), end.getPort());
|
||||
}
|
||||
public ScanRange(InetAddressRange addressRange, PortRange portRange) {
|
||||
super();
|
||||
this.addressRange = addressRange;
|
||||
this.portRange = portRange;
|
||||
}
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
protected InetAddressRange addressRange;
|
||||
protected PortRange portRange;
|
||||
public InetAddressRange getAddressRange() {
|
||||
return addressRange;
|
||||
}
|
||||
public PortRange getPortRange() {
|
||||
return portRange;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return new MultipurposeSocketAddress(addressRange.getBeginHost(), portRange.getBegin())+"~"+new MultipurposeSocketAddress(addressRange.getEndHost(), portRange.getEnd());
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(addressRange, portRange);
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
ScanRange other = (ScanRange) obj;
|
||||
return Objects.equals(addressRange, other.addressRange) && Objects.equals(portRange, other.portRange);
|
||||
}
|
||||
}
|
||||
@@ -35,16 +35,13 @@ public class TCPNetworkScanner implements Runnable {
|
||||
this.processConsumer = processConsumer;
|
||||
}
|
||||
|
||||
private List<InetAddressRange> addressRanges = new ArrayList<>();
|
||||
|
||||
private List<PortRange> portRanges = new ArrayList<>();
|
||||
private List<ScanRange> ranges = new ArrayList<>();
|
||||
|
||||
public List<InetAddressRange> getAddressRanges() {
|
||||
return addressRanges;
|
||||
}
|
||||
|
||||
|
||||
public List<PortRange> getPortRanges() {
|
||||
return portRanges;
|
||||
public List<ScanRange> getRanges() {
|
||||
return ranges;
|
||||
}
|
||||
|
||||
public BiConsumer<MultipurposeSocketAddress,Socket> getConsumer() {
|
||||
@@ -62,24 +59,25 @@ public class TCPNetworkScanner implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
ThreadPoolExecutor exc=(ThreadPoolExecutor) Executors.newFixedThreadPool(8192,new ThreadFactory() {
|
||||
ThreadPoolExecutor exc=(ThreadPoolExecutor) Executors.newFixedThreadPool(512,new ThreadFactory() {
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return ThreadTool.makeVThreadIfSupport("端口扫描线程", r);
|
||||
Thread t=ThreadTool.makeVThreadIfSupport("端口扫描线程", r);
|
||||
t.setPriority(Thread.MIN_PRIORITY);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
|
||||
ThreadPoolExecutor excd=(ThreadPoolExecutor) Executors.newFixedThreadPool(8);
|
||||
|
||||
BigInteger bip=new BigInteger("0");
|
||||
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
|
||||
PortRange portRange = (PortRange) iterator.next();
|
||||
bip=bip.add(portRange.getElementCount());
|
||||
for (Iterator<ScanRange> iterator = ranges.iterator(); iterator.hasNext();) {
|
||||
ScanRange sRange = (ScanRange) iterator.next();
|
||||
bip=bip.add(sRange.getPortRange().getElementCount().multiply(sRange.getAddressRange().getElementCount()));
|
||||
}
|
||||
BigInteger bia=new BigInteger("0");
|
||||
for (Iterator<InetAddressRange> iterator = addressRanges.iterator(); iterator.hasNext();) {
|
||||
InetAddressRange inetAddressRange = (InetAddressRange) iterator.next();
|
||||
bia=bia.add(inetAddressRange.getElementCount());
|
||||
}
|
||||
tot=bip.multiply(bia);
|
||||
|
||||
tot=bip;
|
||||
|
||||
ReentrantLock counterlock=new ReentrantLock();
|
||||
counter=new BigInteger("0");
|
||||
@@ -90,7 +88,12 @@ public class TCPNetworkScanner implements Runnable {
|
||||
if(processConsumer!=null) {
|
||||
BigDecimal bdt=new BigDecimal(tot);
|
||||
BigDecimal bdc=new BigDecimal(counter);
|
||||
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
|
||||
float fp;
|
||||
if(bdt.equals(BigDecimal.ZERO)) {
|
||||
fp=100;
|
||||
}else {
|
||||
fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
|
||||
}
|
||||
processConsumer.accept(fp);
|
||||
}
|
||||
}finally {
|
||||
@@ -98,14 +101,20 @@ public class TCPNetworkScanner implements Runnable {
|
||||
}
|
||||
|
||||
try {
|
||||
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
|
||||
PortRange portRange = (PortRange) iterator.next();
|
||||
for (Iterator<ScanRange> iterator = ranges.iterator(); iterator.hasNext();) {
|
||||
ScanRange sRange = (ScanRange) iterator.next();
|
||||
PortRange portRange=sRange.getPortRange();
|
||||
InetAddressRange inetAddressRange=sRange.getAddressRange();
|
||||
|
||||
while( excd.getQueue().size()>500) {
|
||||
LockSupport.parkNanos(1000000);
|
||||
}
|
||||
excd.execute(()->{
|
||||
int curport = portRange.getBegin();
|
||||
while (curport <= portRange.getEnd()) {
|
||||
|
||||
for (Iterator<InetAddressRange> iterator2 = addressRanges.iterator(); iterator2.hasNext();) {
|
||||
InetAddressRange inetAddressRange = (InetAddressRange) iterator2.next();
|
||||
|
||||
|
||||
|
||||
byte[]endarr=inetAddressRange.getEnd().getAddress();
|
||||
byte[] curr = inetAddressRange.getBegin().getAddress();
|
||||
while (compareIPAddress(curr,endarr)) {
|
||||
@@ -113,16 +122,16 @@ public class TCPNetworkScanner implements Runnable {
|
||||
int curport0=curport;
|
||||
InetAddress currAddress=pga(curr);
|
||||
|
||||
while( exc.getQueue().size()>1000) {
|
||||
while( exc.getQueue().size()>500) {
|
||||
LockSupport.parkNanos(1000000);
|
||||
}
|
||||
exc.execute(()->{
|
||||
|
||||
|
||||
MultipurposeSocketAddress mpsa;
|
||||
if (inetAddressRange.getBeginHost() != null&&currAddress.equals(inetAddressRange.getBegin())) {
|
||||
if (currAddress.equals(inetAddressRange.getBegin())) {
|
||||
mpsa = new MultipurposeSocketAddress(inetAddressRange.getBeginHost(), curport0);
|
||||
}else if (inetAddressRange.getEndHost() != null&&currAddress.equals(inetAddressRange.getEnd())) {
|
||||
}else if (currAddress.equals(inetAddressRange.getEnd())) {
|
||||
mpsa = new MultipurposeSocketAddress(inetAddressRange.getEndHost(), curport0);
|
||||
} else {
|
||||
mpsa = new MultipurposeSocketAddress(currAddress.getHostAddress(),
|
||||
@@ -135,11 +144,17 @@ public class TCPNetworkScanner implements Runnable {
|
||||
//System.out.println(isa);
|
||||
s.connect(isa,connectTimeout);
|
||||
s.setSoTimeout(soTimeout);
|
||||
|
||||
try {
|
||||
acceptMultipurposeSocketAddress(mpsa, s);
|
||||
}catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
||||
try {
|
||||
acceptMultipurposeSocketAddress(mpsa, null);
|
||||
}catch(Exception ed) {
|
||||
ed.printStackTrace();
|
||||
}
|
||||
} finally {
|
||||
if (s != null)
|
||||
try {
|
||||
@@ -154,7 +169,11 @@ public class TCPNetworkScanner implements Runnable {
|
||||
BigDecimal bdt=new BigDecimal(tot);
|
||||
BigDecimal bdc=new BigDecimal(counter);
|
||||
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
|
||||
try {
|
||||
processConsumer.accept(fp);
|
||||
}catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}finally {
|
||||
counterlock.unlock();
|
||||
@@ -162,7 +181,7 @@ public class TCPNetworkScanner implements Runnable {
|
||||
});
|
||||
increaceIPAddress(curr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
Thread.sleep(10);
|
||||
@@ -172,10 +191,16 @@ public class TCPNetworkScanner implements Runnable {
|
||||
|
||||
curport++;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
}finally {
|
||||
excd.shutdown();
|
||||
try {
|
||||
excd.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
exc.shutdown();
|
||||
try {
|
||||
exc.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
@@ -233,15 +258,14 @@ public class TCPNetworkScanner implements Runnable {
|
||||
}
|
||||
|
||||
public TCPNetworkScanner() {
|
||||
// TODO 自动生成的构造函数存根
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws UnknownHostException {
|
||||
TCPNetworkScanner tcn = new TCPNetworkScanner();
|
||||
tcn.getPortRanges().add(new PortRange(25565));
|
||||
tcn.getPortRanges().add(new PortRange(34000, 38000));
|
||||
tcn.getAddressRanges().add(new InetAddressRange("192.168.0.1","192.168.1.255"));
|
||||
//tcn.getRanges().add(new ScanRange(new InetAddressRange("127.0.0.1","127.0.0.2"),new PortRange(25565,37000)));
|
||||
tcn.getRanges().add(new ScanRange("ip.8mi.work:50000~ip.8mi.work:60000"));
|
||||
tcn.setConsumer((scanned,s) -> {
|
||||
if(s!=null)
|
||||
System.out.println(scanned);
|
||||
});
|
||||
tcn.setProcessConsumer((f)->{System.out.println(f);
|
||||
|
||||
Reference in New Issue
Block a user