优化代码,性能暴涨

This commit is contained in:
Administrator
2025-01-29 14:01:11 +08:00
parent e243203535
commit 6de65562be
130 changed files with 9138 additions and 1020 deletions
@@ -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);