From 1af088a29d57b082c340a247eb512e6879ddccfd Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 30 Dec 2022 20:01:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E5=BA=A6=E7=AE=97?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E9=81=BF=E5=85=8D=E8=B7=AF=E7=94=B1=E9=9C=87?= =?UTF-8?q?=E8=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KLALB/KNECloud/iplist.json | 44 ++++++++---- klalbs.json | 44 +++++++----- src/assets/close.png | Bin 3005 -> 2990 bytes src/assets/maxium.png | Bin 2842 -> 2838 bytes src/assets/minium.png | Bin 2813 -> 2814 bytes src/org/kne/cloud/network/klalb/Consts.java | 4 +- .../cloud/network/klalb/IOThreadManager.java | 13 ++++ .../kne/cloud/network/klalb/KLALBBlock.java | 2 +- .../cloud/network/klalb/KLALBClientGUI.java | 2 +- .../kne/cloud/network/klalb/KLALBCore.java | 38 +++++++--- .../network/klalb/LocalTCPConnection.java | 11 +-- .../network/klalb/RemoteTCPConnection.java | 68 ++++++++++++++---- src/org/kne/cloud/network/klalb/Tunnel.java | 17 ++++- .../kne/cloud/network/mport/ThreadTool.java | 13 +++- src/org/kne/ui/XFrame.java | 1 + src/org/kne/ui/YScrollPane.java | 11 +++ 16 files changed, 201 insertions(+), 67 deletions(-) diff --git a/KLALB/KNECloud/iplist.json b/KLALB/KNECloud/iplist.json index 819b857..188830d 100644 --- a/KLALB/KNECloud/iplist.json +++ b/KLALB/KNECloud/iplist.json @@ -14,6 +14,12 @@ "localaddress" : "127.0.0.1:3389" } ], "tunnels" : [ { + "name" : "Openfrp-直连线路", + "remoteaddress" : "127.0.0.1:4566" + }, { + "name" : "Openfrp-直连线路", + "remoteaddress" : "127.0.0.1:4566" + },{ "name" : "NULL-宿迁联通", "remoteaddress" : "153.36.240.12:65529" }, { @@ -29,8 +35,26 @@ "name" : "Openfrp-美国-8「BGP」", "remoteaddress" : "us-los-bgp-8.openfrp.top:65529" }, { - "name" : "Openfrp-新加坡-1「BGP」", - "remoteaddress" : "singa-bgp-2.openfrp.top:65529" + "name" : "Sakurafrp-安徽电信-1", + "remoteaddress" : "cn-ah-dx-1.natfrp.cloud:65529" + }, { + "name" : "Sakurafrp-十堰电信-1", + "remoteaddress" : "cn-sy-dx-1.natfrp.cloud:65529" + }, { + "name" : "Sakurafrp-武汉电信-1", + "remoteaddress" : "cn-wh-dx-1.natfrp.cloud:65529" + }, { + "name" : "Sakurafrp-枣庄BGP-10", + "remoteaddress" : "cn-zz-bgp-10.natfrp.cloud:23330" + }, { + "name" : "Sakurafrp-枣庄BGP-7", + "remoteaddress" : "cn-zz-bgp-7.natfrp.cloud:33336" + }, { + "name" : "HYHBX-深圳阿里-1", + "remoteaddress" : "119.23.238.91:12413" + }, { + "name" : "HYHBX-上海腾讯-2", + "remoteaddress" : "43.143.109.64:49965" }, { "name" : "XYZ-韩国首尔", "remoteaddress" : "frp.104300.xyz:49965" @@ -40,19 +64,13 @@ }, { "name" : "aFrps-新加坡", "remoteaddress" : "sg.afrps.cn:49966" + }, { + "name" : "aFrps-美国芝加哥", + "remoteaddress" : "ch.afrps.cn:49966" }, { "name" : "aFrps-美国圣何塞", "remoteaddress" : "sj.afrps.cn:49966" - }, { - "name" : "Sakurafrp-安徽电信-1", - "remoteaddress" : "cn-ah-dx-1.natfrp.cloud:65529" - }, { - "name" : "Sakurafrp-十堰电信-1", - "remoteaddress" : "cn-sy-dx-1.natfrp.cloud:65529" - }, { - "name" : "Sakurafrp-武汉电信-1", - "remoteaddress" : "cn-wh-dx-1.natfrp.cloud:65529" - }, { + } , { "name" : "Freefrp-韩国首尔-0", "remoteaddress" : "frp.freefrp.net:49965" }, { @@ -64,5 +82,5 @@ }, { "name" : "Freefrp-韩国首尔-4", "remoteaddress" : "frp4.freefrp.net:49965" - } ] + }] } \ No newline at end of file diff --git a/klalbs.json b/klalbs.json index 2022c7c..188830d 100644 --- a/klalbs.json +++ b/klalbs.json @@ -16,6 +16,9 @@ "tunnels" : [ { "name" : "Openfrp-直连线路", "remoteaddress" : "127.0.0.1:4566" + }, { + "name" : "Openfrp-直连线路", + "remoteaddress" : "127.0.0.1:4566" },{ "name" : "NULL-宿迁联通", "remoteaddress" : "153.36.240.12:65529" @@ -31,18 +34,6 @@ }, { "name" : "Openfrp-美国-8「BGP」", "remoteaddress" : "us-los-bgp-8.openfrp.top:65529" - }, { - "name" : "XYZ-韩国首尔", - "remoteaddress" : "frp.104300.xyz:49965" - }, { - "name" : "aFrps-美国洛杉矶", - "remoteaddress" : "la.afrps.cn:49966" - }, { - "name" : "aFrps-新加坡", - "remoteaddress" : "sg.afrps.cn:49966" - }, { - "name" : "aFrps-美国圣何塞", - "remoteaddress" : "sj.afrps.cn:49966" }, { "name" : "Sakurafrp-安徽电信-1", "remoteaddress" : "cn-ah-dx-1.natfrp.cloud:65529" @@ -59,6 +50,27 @@ "name" : "Sakurafrp-枣庄BGP-7", "remoteaddress" : "cn-zz-bgp-7.natfrp.cloud:33336" }, { + "name" : "HYHBX-深圳阿里-1", + "remoteaddress" : "119.23.238.91:12413" + }, { + "name" : "HYHBX-上海腾讯-2", + "remoteaddress" : "43.143.109.64:49965" + }, { + "name" : "XYZ-韩国首尔", + "remoteaddress" : "frp.104300.xyz:49965" + }, { + "name" : "aFrps-美国洛杉矶", + "remoteaddress" : "la.afrps.cn:49966" + }, { + "name" : "aFrps-新加坡", + "remoteaddress" : "sg.afrps.cn:49966" + }, { + "name" : "aFrps-美国芝加哥", + "remoteaddress" : "ch.afrps.cn:49966" + }, { + "name" : "aFrps-美国圣何塞", + "remoteaddress" : "sj.afrps.cn:49966" + } , { "name" : "Freefrp-韩国首尔-0", "remoteaddress" : "frp.freefrp.net:49965" }, { @@ -70,11 +82,5 @@ }, { "name" : "Freefrp-韩国首尔-4", "remoteaddress" : "frp4.freefrp.net:49965" - }, { - "name" : "HYHBX-深圳阿里-1", - "remoteaddress" : "119.23.238.91:49965" - }, { - "name" : "HYHBX-上海腾讯-2", - "remoteaddress" : "43.143.109.64:49965" - } ] + }] } \ No newline at end of file diff --git a/src/assets/close.png b/src/assets/close.png index 4aa652de6b244de707b3ba8d75d2180a812af169..5163cb06331aed3b9039029a238a44f5ab0c130c 100644 GIT binary patch delta 249 zcmVA(Md|8~s$Y}@uVj^l$0$IQB>X|5z90RYTwUntxIfQSSl zA`%f_0x&Zdg&x4?5dewEF#--N!o$olp9t_vfK2FDV*wylbrEsk@~Eonel8>j48w3Q z7UlqEz5xI;-{_x7&dfai<(!17+Qlz)MS!&JcsO|rVRPH5=Un(zV_57tImXCaEp)R4 ziMSEj#mvvTuFrknU#hAqy#qf@)9F0`k(mg5Q;^D<00000NkvXXu0mjfA((H@ delta 265 zcmV+k0rvi`7rhs-z6yWpNklb>!3`M^d1HNQnSkaIJ(Bxtc?PB;2$vJ}b zGP#8TFYF=)YAU;~04=ot<0rp@sy>%x`IzVVhJ$AqhQ4iEg@_~oMnoqw!(W$(P5?|q z63h%D5|03gsLR3#05CHEfQVc&;JhI`dq=OmK4w6y0SaL(>py?!0Km*$26UxWX71kI z{IXX9#&LXX39DiUsOlYnsp@@efz_gSR@JY6b#@^$_j!c=(9FK={BX(?((blB=Ti6< zW2)xt9kb=lCHe^N;6>aM)?yTq6jb%OuIuMCO;`V6?}QK_BC%$qDQYZqY3SG!mQ?mDg0& z0-UU>mP!ECOoB;NbMb*AANgPT?rxGeJkthv00030{{sMt_aoTfsN8=50000`cHJjJ}yS>$@{s)G!qjNe)z9*J9aTZR!54Ffq~)we`bcS-7NCwi+;=oav3~b L{an^LB{Ts5T&EOv delta 54 zcmew-`d4(rJ}ySB$@{s)G*S{06twLm+#eSjWU??YF#P||%+NERU9?K(eglxp;OXk; Jvd$@?2><{`5sv@> diff --git a/src/org/kne/cloud/network/klalb/Consts.java b/src/org/kne/cloud/network/klalb/Consts.java index dd36334..c3a27f4 100644 --- a/src/org/kne/cloud/network/klalb/Consts.java +++ b/src/org/kne/cloud/network/klalb/Consts.java @@ -1,8 +1,8 @@ package org.kne.cloud.network.klalb; public class Consts { - public static final int BLOCKSIZE=32768; - public static final long PINGTIMENS=2000000000L; + public static final int BLOCKSIZE=16384; + public static final long PINGTIMENS=1000000000L; public static final double A = 0.125; public static final int SO_TIMEOUT = 20000; public static final long SN_KEEP = 60000000000L; diff --git a/src/org/kne/cloud/network/klalb/IOThreadManager.java b/src/org/kne/cloud/network/klalb/IOThreadManager.java index 54a8043..8fa09a8 100644 --- a/src/org/kne/cloud/network/klalb/IOThreadManager.java +++ b/src/org/kne/cloud/network/klalb/IOThreadManager.java @@ -9,9 +9,13 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.UUID; import java.util.Vector; import java.util.WeakHashMap; +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; import org.kne.cloud.network.mport.ServiceElement; @@ -168,6 +172,15 @@ public class IOThreadManager { e.printStackTrace(); } finally { klc.getRemotetcps().remove(tc); + Queue sq=tc.getSendDeque(); + KLALBBlock tmp; + while((tmp=sq.poll())!=null) { + try { + klc.submitDataBlock(tmp); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } } diff --git a/src/org/kne/cloud/network/klalb/KLALBBlock.java b/src/org/kne/cloud/network/klalb/KLALBBlock.java index 7f55873..ddd58f4 100644 --- a/src/org/kne/cloud/network/klalb/KLALBBlock.java +++ b/src/org/kne/cloud/network/klalb/KLALBBlock.java @@ -11,7 +11,7 @@ public class KLALBBlock implements Comparable{ private static AtomicLong sng=new AtomicLong(1); public long sn;//每个数据包的唯一编号 - public long cuid;//用于识别数据包的stream ID号 + public int cuid;//用于识别数据包的stream ID号 public long number;//数据包的编号,用于排序 public byte[]data;//数据内容 public int command;//功能标记 0=PING 1=PONG 2=SYN 3=RST diff --git a/src/org/kne/cloud/network/klalb/KLALBClientGUI.java b/src/org/kne/cloud/network/klalb/KLALBClientGUI.java index 721b1d9..795795e 100644 --- a/src/org/kne/cloud/network/klalb/KLALBClientGUI.java +++ b/src/org/kne/cloud/network/klalb/KLALBClientGUI.java @@ -210,7 +210,7 @@ public class KLALBClientGUI extends XFrame { for (Iterator iterator = lse.iterator(); iterator.hasNext();) { ServiceElement serviceElement = (ServiceElement) iterator.next(); ProxyIPPortProperties pippp = new ProxyIPPortProperties(pdis, serviceElement.name, - "127.0.0.1", serviceElement.ipport.getPort()); + "0.0.0.0", serviceElement.ipport.getPort()); try { kc.open(pippp.getBindPort(), serviceElement, pippp.getBindIP()); } catch (BindException e) { diff --git a/src/org/kne/cloud/network/klalb/KLALBCore.java b/src/org/kne/cloud/network/klalb/KLALBCore.java index 619284e..91876c5 100644 --- a/src/org/kne/cloud/network/klalb/KLALBCore.java +++ b/src/org/kne/cloud/network/klalb/KLALBCore.java @@ -26,6 +26,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingDeque; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; @@ -37,7 +38,7 @@ import org.kne.cloud.network.mport.ThreadTool; public class KLALBCore { private volatile int cacheblocks; - private Map localtcps = new ConcurrentHashMap<>(); + private Map localtcps = new ConcurrentHashMap<>(); private List remotetcps = new Vector<>(); private PredicateacceptSYN; @@ -81,7 +82,7 @@ public class KLALBCore { this.acceptSYN = acceptSYN; } - public Map getLocaltcps() { + public Map getLocaltcps() { return localtcps; } @@ -103,21 +104,28 @@ public class KLALBCore { pdb.pingtime=System.nanoTime(); tc.sendBlock(pdb); } - if(!tc.getSendDeque().isEmpty()) + if(!tc.getNDSendDeque().isEmpty()||!tc.getSendDeque().isEmpty()) break; - Thread.sleep(1); + synchronized (tc.getSendDeque()) { + tc.getSendDeque().wait(10); + } } + KLALBBlock k0=tc.getNDSendDeque().poll(); + if(k0!=null) { + tc.sendBlock(k0,tc.getNDSendDeque().isEmpty()); + }else { KLALBBlock k=tc.getSendDeque().poll(); if(k!=null) { //if(localtcps.containsKey(k.cuid)||k.cuid.equals(ZERO_UUID)) - tc.sendBlock(k); + tc.sendBlock(k,tc.getSendDeque().isEmpty()); + } } } public void remoteReceive(RemoteTCPConnection tc) throws IOException { KLALBBlock brc=null; for(;;) { brc=tc.receiveBlock(); - if(brc.number!=0) { + if(brc.number!=0||brc.sn==0) { break; } SN s=new SN(brc.sn); @@ -148,11 +156,11 @@ public class KLALBCore { pdb.number=0; pdb.command=1; pdb.pingtime=brc.pingtime; - tc.getSendDeque().addFirst(pdb); + tc.getNDSendDeque().offer(pdb); }else if(brc.command==1) { long cur=System.nanoTime(); long delay=(cur-brc.pingtime)/2; - tc.setDelay(delay); + tc.setDelayAvg(delay); } } }else { @@ -215,11 +223,15 @@ public class KLALBCore { } } }); + //System.out.println(remotetcps); for (Iterator iterator = remotetcps.iterator(); iterator.hasNext();) { RemoteTCPConnection remoteTCPConnection = (RemoteTCPConnection) iterator.next(); - BlockingDeque bdq=remoteTCPConnection.getSendDeque(); - if(bdq.size()<2) { + Queue bdq=remoteTCPConnection.getSendDeque(); + if(bdq.size()<1) { bdq.add(kb); + synchronized (bdq) { + bdq.notifyAll(); + } return; } } @@ -232,7 +244,11 @@ public class KLALBCore { synchronized (remotetcps) { for (Iterator iterator = remotetcps.iterator(); iterator.hasNext();) { RemoteTCPConnection rmt = (RemoteTCPConnection) iterator.next(); - rmt.getSendDeque().addFirst(kb); + Queue sq = rmt.getNDSendDeque(); + sq.offer(kb); + synchronized (sq) { + sq.notifyAll(); + } } } } diff --git a/src/org/kne/cloud/network/klalb/LocalTCPConnection.java b/src/org/kne/cloud/network/klalb/LocalTCPConnection.java index 5aa1b88..bf57505 100644 --- a/src/org/kne/cloud/network/klalb/LocalTCPConnection.java +++ b/src/org/kne/cloud/network/klalb/LocalTCPConnection.java @@ -5,15 +5,16 @@ import java.net.Socket; import java.util.*; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import org.kne.cloud.network.mport.ServiceElement; public class LocalTCPConnection extends TCPConnection { - private static AtomicLong sng=new AtomicLong(1); + private static AtomicInteger sng=new AtomicInteger(1); -private long cuid; +private int cuid; private ServiceElement serviceElement; @@ -26,14 +27,14 @@ private volatile long outputcount = 1; super(s); cuid=sng.getAndIncrement(); } - public LocalTCPConnection(Socket s,long uid) throws IOException { + public LocalTCPConnection(Socket s,int uid) throws IOException { super(s); cuid=uid; } - public long getCuid() { + public int getCuid() { return cuid; } - public void setCuid(long cuid) { + public void setCuid(int cuid) { this.cuid = cuid; } public ServiceElement getServiceElement() { diff --git a/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java b/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java index c480952..7e934e0 100644 --- a/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java +++ b/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java @@ -10,9 +10,13 @@ import java.io.OutputStream; import java.io.StreamCorruptedException; import java.net.Socket; import java.net.UnknownHostException; +import java.util.Queue; import java.util.Random; import java.util.UUID; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingDeque; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -54,10 +58,15 @@ public class RemoteTCPConnection extends TCPConnection { } - dout = new DataOutputStream(new AddOutputStream(new BufferedOutputStream(outm)) ); - din = new DataInputStream(new AddInputStream(new BufferedInputStream(inm))); + dout = new DataOutputStream(new BufferedOutputStream(outm,Consts.BLOCKSIZE*2+1) ); + din = new DataInputStream(new BufferedInputStream(inm,Consts.BLOCKSIZE*2+1)); } + @Override + public String toString() { + return "RemoteTCPConnection [tunnel=" + tunnel + "]"; + } + public RemoteTCPConnection(Tunnel t, Socket s) throws UnknownHostException, IOException { super(s); tunnel=t; @@ -87,7 +96,17 @@ public class RemoteTCPConnection extends TCPConnection { } } - + long odelay=Long.MAX_VALUE; + public void setDelayAvg(long delay) { + if(odelay==Long.MAX_VALUE) { + odelay=delay; + setDelay(odelay); + }else { + odelay=(delay+odelay*100)/101; + setDelay(odelay); + } + } + @Override public void close() { if (tunnel != null) { @@ -103,20 +122,27 @@ public class RemoteTCPConnection extends TCPConnection { } super.finalize(); } - public void sendBlock(KLALBBlock data) throws IOException { - dout.writeLong(data.sn); - dout.writeLong(data.cuid); + sendBlock(data,true); + } + public void sendBlock(KLALBBlock data,boolean isflush) throws IOException { + + dout.writeInt(data.cuid); dout.writeLong(data.number); if (data.number > 0) { if (data.data == null) { - dout.writeInt(-1); + dout.writeShort(-1); } else { - dout.writeInt(data.data.length); + dout.writeShort(data.data.length); dout.write(data.data); } } else if (data.number == 0) { dout.write(data.command); + if(data.command!=0&&data.command!=1) { + dout.writeLong(data.sn); + }else { + + } switch (data.command) { case 0: case 1: @@ -126,11 +152,14 @@ public class RemoteTCPConnection extends TCPConnection { dout.writeUTF(data.lservice); dout.writeUTF(data.lipport.toString()); break; + default: + break; } } else { dout.writeInt(data.cacheused); } + if(isflush) dout.flush(); //System.out.println("SEND:" + data); @@ -138,11 +167,10 @@ public class RemoteTCPConnection extends TCPConnection { public KLALBBlock receiveBlock() throws IOException { KLALBBlock klb = new KLALBBlock(); - klb.sn = din.readLong(); - klb.cuid = din.readLong(); + klb.cuid = din.readInt(); klb.number = din.readLong(); if (klb.number > 0) { - int size = din.readInt(); + int size = din.readShort(); if (size == -1) { klb.data = null; } else { @@ -152,6 +180,11 @@ public class RemoteTCPConnection extends TCPConnection { } } else if (klb.number == 0) { klb.command = din.read(); + if(klb.command!=0&&klb.command!=1) { + klb.sn = din.readLong(); + }else { + klb.sn=0; + } switch (klb.command) { case 0: case 1: @@ -160,6 +193,9 @@ public class RemoteTCPConnection extends TCPConnection { case 2: klb.lservice = din.readUTF(); klb.lipport = new IPPort(din.readUTF()); + break; + default: + break; } } else { klb.cacheused = din.readInt(); @@ -180,10 +216,16 @@ public class RemoteTCPConnection extends TCPConnection { return false; } } + + private Queue NDsendDeque = new ConcurrentLinkedQueue<>(); - private BlockingDeque sendDeque = new LinkedBlockingDeque<>(); + public Queue getNDSendDeque() { + return NDsendDeque; + } + + private Queue sendDeque = new ConcurrentLinkedQueue<>(); - public BlockingDeque getSendDeque() { + public Queue getSendDeque() { return sendDeque; } diff --git a/src/org/kne/cloud/network/klalb/Tunnel.java b/src/org/kne/cloud/network/klalb/Tunnel.java index 357b7ef..e1137ec 100644 --- a/src/org/kne/cloud/network/klalb/Tunnel.java +++ b/src/org/kne/cloud/network/klalb/Tunnel.java @@ -4,7 +4,9 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.PrintStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; @@ -83,7 +85,7 @@ public class Tunnel{ @Override public String toString() { - return getName()+"$"+getIpport(); + return getName()+"$"+getIpport()+" "+delay/1000000; } public Socket connectClientSocket() throws UnknownHostException, IOException { Socket socket=new Socket(); @@ -138,8 +140,21 @@ public class Tunnel{ public AtomicLong getIM() { return im; } + PrintStream ndbg=null; + private void initcdbg() { + try { + ndbg=new PrintStream(name+".csv"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } public void updateTraffics(long timems) { tlr.setTraffic(om.get(), im.get(), om.get()-om1, im.get()-im1); + + if(ndbg==null) + initcdbg(); + ndbg.println((om.get()-om1)+ (im.get()-im1)+","+delay); + om1=om.get(); im1=im.get(); } diff --git a/src/org/kne/cloud/network/mport/ThreadTool.java b/src/org/kne/cloud/network/mport/ThreadTool.java index 2256f20..aca3894 100644 --- a/src/org/kne/cloud/network/mport/ThreadTool.java +++ b/src/org/kne/cloud/network/mport/ThreadTool.java @@ -1,14 +1,25 @@ package org.kne.cloud.network.mport; +import java.lang.reflect.Method; + public class ThreadTool { public static boolean first=true; public static boolean forceD=false; public static Thread makeVThreadIfSupport(String name,Runnable r) { if(forceD) return new Thread(r, name); - try { return new Thread(r, name); + try { //return new Thread(r, name); + Class c=Class.forName("java.lang.Thread"); + Method m= c.getDeclaredMethod("ofVirtual", null); + Object o=m.invoke(null, null); + Class cb=Class.forName("java.lang.Thread$Builder"); + Method mn= cb.getDeclaredMethod("name", String.class); + mn.invoke(o, name); + Method mu= cb.getDeclaredMethod("unstarted", Runnable.class); + return (Thread) mu.invoke(o, r); //return Thread.ofVirtual().name(name).unstarted(r); }catch(Throwable e) { + //e.printStackTrace(); if(first) { System.out.println("请使用java19以上版本以提高性能!"); first=false; diff --git a/src/org/kne/ui/XFrame.java b/src/org/kne/ui/XFrame.java index 7bbc8f7..0dd7ec9 100644 --- a/src/org/kne/ui/XFrame.java +++ b/src/org/kne/ui/XFrame.java @@ -568,5 +568,6 @@ public class XFrame extends JFrame { } }); + } } diff --git a/src/org/kne/ui/YScrollPane.java b/src/org/kne/ui/YScrollPane.java index 832605a..abb75fd 100644 --- a/src/org/kne/ui/YScrollPane.java +++ b/src/org/kne/ui/YScrollPane.java @@ -12,6 +12,9 @@ import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; + import javax.swing.JScrollBar; public class YScrollPane extends JPanel { @@ -109,6 +112,14 @@ settings.addContainerListener(new ContainerListener() { } }); + settings.addMouseWheelListener(new MouseWheelListener() { + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + int x=e.getWheelRotation()*20; + scrollBar.setValue(scrollBar.getValue()+x); + } + }); } public JPanel getView() {