diff --git a/klalbs.json b/klalbs.json index 819b857..2022c7c 100644 --- a/klalbs.json +++ b/klalbs.json @@ -14,6 +14,9 @@ "localaddress" : "127.0.0.1:3389" } ], "tunnels" : [ { + "name" : "Openfrp-直连线路", + "remoteaddress" : "127.0.0.1:4566" + },{ "name" : "NULL-宿迁联通", "remoteaddress" : "153.36.240.12:65529" }, { @@ -28,9 +31,6 @@ }, { "name" : "Openfrp-美国-8「BGP」", "remoteaddress" : "us-los-bgp-8.openfrp.top:65529" - }, { - "name" : "Openfrp-新加坡-1「BGP」", - "remoteaddress" : "singa-bgp-2.openfrp.top:65529" }, { "name" : "XYZ-韩国首尔", "remoteaddress" : "frp.104300.xyz:49965" @@ -52,6 +52,12 @@ }, { "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" : "Freefrp-韩国首尔-0", "remoteaddress" : "frp.freefrp.net:49965" @@ -64,5 +70,11 @@ }, { "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/org/kne/cloud/network/klalb/Consts.java b/src/org/kne/cloud/network/klalb/Consts.java index e1950c4..dd36334 100644 --- a/src/org/kne/cloud/network/klalb/Consts.java +++ b/src/org/kne/cloud/network/klalb/Consts.java @@ -1,11 +1,12 @@ package org.kne.cloud.network.klalb; public class Consts { - public static final int BLOCKSIZE=16384; + public static final int BLOCKSIZE=32768; public static final long PINGTIMENS=2000000000L; public static final double A = 0.125; public static final int SO_TIMEOUT = 20000; public static final long SN_KEEP = 60000000000L; - public static final int MAX_RESEND = 20; + public static final int MAX_RESEND = 100; public static final long UACK_TIME = 10000000000L; + public static final int CONNECT_TIMEOUT=10000; } diff --git a/src/org/kne/cloud/network/klalb/IOThreadManager.java b/src/org/kne/cloud/network/klalb/IOThreadManager.java index f7e8a52..54a8043 100644 --- a/src/org/kne/cloud/network/klalb/IOThreadManager.java +++ b/src/org/kne/cloud/network/klalb/IOThreadManager.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; +import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; @@ -17,13 +19,16 @@ import org.kne.cloud.network.mport.ThreadTool; public class IOThreadManager { private KLALBCore klc = new KLALBCore(2000); - private boolean isopen = true; + private volatile boolean isopen = true; public IOThreadManager() { } public void handleLocal(LocalTCPConnection tc, boolean syn) { + if(!isopen) { + return; + } klc.getLocaltcps().put(tc.getCuid(), tc); AtomicBoolean AB=new AtomicBoolean(true); try { @@ -129,6 +134,9 @@ public class IOThreadManager { } public void handleRemote(RemoteTCPConnection tc) { + if(!isopen) { + return; + } klc.getRemotetcps().add(tc); try { Thread rs = ThreadTool.makeVThreadIfSupport("远程发送线程", () -> { @@ -165,7 +173,22 @@ public class IOThreadManager { public void close() { isopen = false; - //klc.get + Collectionltcc= klc.getLocaltcps().values(); + synchronized ( klc.getLocaltcps()) { + + for (Iterator iterator = ltcc.iterator(); iterator.hasNext();) { + LocalTCPConnection localTCPConnection = (LocalTCPConnection) iterator.next(); + localTCPConnection.close(); + } + } + Listrtcc= klc.getRemotetcps(); + synchronized (rtcc) { + + for (Iterator iterator = rtcc.iterator(); iterator.hasNext();) { + RemoteTCPConnection remoteTCPConnection = (RemoteTCPConnection) iterator.next(); + remoteTCPConnection.close(); + } + } } public boolean isOpen() { diff --git a/src/org/kne/cloud/network/klalb/InputMetre.java b/src/org/kne/cloud/network/klalb/InputMetre.java index 4009423..cb736a8 100644 --- a/src/org/kne/cloud/network/klalb/InputMetre.java +++ b/src/org/kne/cloud/network/klalb/InputMetre.java @@ -7,9 +7,10 @@ import java.util.concurrent.atomic.AtomicLong; public class InputMetre extends InputStream { private InputStream in; - private AtomicLong total=new AtomicLong(0); - public InputMetre(InputStream inputStream) { + private AtomicLong total; + public InputMetre(InputStream inputStream,AtomicLong v) { this.in=inputStream; + this.total=v; } @Override @@ -69,4 +70,5 @@ public class InputMetre extends InputStream { return in.markSupported(); } + } diff --git a/src/org/kne/cloud/network/klalb/KLALBClient.java b/src/org/kne/cloud/network/klalb/KLALBClient.java index 7996ce5..46ab513 100644 --- a/src/org/kne/cloud/network/klalb/KLALBClient.java +++ b/src/org/kne/cloud/network/klalb/KLALBClient.java @@ -19,6 +19,7 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Random; import java.util.Scanner; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -71,7 +72,6 @@ public class KLALBClient { try { re++; tc=new RemoteTCPConnection(tll); - tc.getDout().writeShort(59649); tc.getDout().write(1); tc.getDout().writeUTF(tll.getName()); tc.getDout().writeUTF(tll.getIp()); @@ -101,7 +101,7 @@ public class KLALBClient { } try { //System.out.println(re); - Thread.sleep(500*(1<ts=kc.getTls(); + synchronized(ts) { + for(int i=0;i iterator = remotetcps.iterator(); iterator.hasNext();) { RemoteTCPConnection remoteTCPConnection = (RemoteTCPConnection) iterator.next(); BlockingDeque bdq=remoteTCPConnection.getSendDeque(); - if(bdq.size()<1) { + if(bdq.size()<2) { bdq.add(kb); return; } diff --git a/src/org/kne/cloud/network/klalb/KLALBIPList.java b/src/org/kne/cloud/network/klalb/KLALBIPList.java index ad913af..adc9223 100644 --- a/src/org/kne/cloud/network/klalb/KLALBIPList.java +++ b/src/org/kne/cloud/network/klalb/KLALBIPList.java @@ -4,7 +4,9 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.ConnectException; +import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketAddress; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Iterator; @@ -17,8 +19,9 @@ public class KLALBIPList { IPPort u=new IPPort(ipport); TCPConnection tcpc=null; try { - tcpc=new RemoteTCPConnection(null, new Socket(u.getIp(),u.getPort())); - tcpc.getDout().writeShort(59649); + Socket soc=new Socket(); + soc.connect(new InetSocketAddress(u.getIp(),u.getPort()), Consts.CONNECT_TIMEOUT); + tcpc=new RemoteTCPConnection(null, soc); tcpc.getDout().write(0); tcpc.getDout().flush(); String json=tcpc.getDin().readUTF(); diff --git a/src/org/kne/cloud/network/klalb/KLALBServer.java b/src/org/kne/cloud/network/klalb/KLALBServer.java index 3320974..e3e40dc 100644 --- a/src/org/kne/cloud/network/klalb/KLALBServer.java +++ b/src/org/kne/cloud/network/klalb/KLALBServer.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; import org.kne.cloud.network.mport.IPPort; @@ -21,7 +22,7 @@ import org.kne.cloud.network.mport.ThreadTool; public class KLALBServer { - WeakHashMap whm=new WeakHashMap<>(); + Map whm=new WeakHashMap(); public KLALBServer(int port,Supplier gjso) throws IOException { TCPListener tcpl=new TCPListener(port); tcpl.setCon((s)->{ @@ -30,10 +31,7 @@ public class KLALBServer { //s.setSoTimeout(10000); tcc=new RemoteTCPConnection(null,s); DataInputStream din=tcc.getDin(); - int val=din.readShort()&0xffff; - if(val!=59649) { - return; - } + int x=din.read(); if(x==0) { String sj=gjso.get(); @@ -49,6 +47,7 @@ public class KLALBServer { tcc.setTunnel(tll); UUID uid=new UUID(din.readLong(),din.readLong()); + System.out.println(uid); IOThreadManager nx = null; synchronized (tcpl) { if(whm.containsKey(uid)) { @@ -64,7 +63,7 @@ public class KLALBServer { try { n1.handleLocal(ltc, false); }finally { - n1.close(); + ltc.close(); } }).start(); return true; diff --git a/src/org/kne/cloud/network/klalb/OutputMetre.java b/src/org/kne/cloud/network/klalb/OutputMetre.java index 4678c97..18f2dc2 100644 --- a/src/org/kne/cloud/network/klalb/OutputMetre.java +++ b/src/org/kne/cloud/network/klalb/OutputMetre.java @@ -7,9 +7,10 @@ import java.util.concurrent.atomic.AtomicLong; public class OutputMetre extends OutputStream { private OutputStream out; - private AtomicLong total=new AtomicLong(0); - public OutputMetre(OutputStream outputStream) { + private AtomicLong total; + public OutputMetre(OutputStream outputStream,AtomicLong v) { this.out=outputStream; + this.total=v; } @Override @@ -40,4 +41,6 @@ public class OutputMetre extends OutputStream { out.close(); } + + } diff --git a/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java b/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java index 14a25d1..c480952 100644 --- a/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java +++ b/src/org/kne/cloud/network/klalb/RemoteTCPConnection.java @@ -1,31 +1,67 @@ package org.kne.cloud.network.klalb; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StreamCorruptedException; import java.net.Socket; import java.net.UnknownHostException; +import java.util.Random; import java.util.UUID; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; import org.kne.cloud.network.mport.IPPort; +import org.kne.io.AddInputStream; +import org.kne.io.AddOutputStream; public class RemoteTCPConnection extends TCPConnection { public RemoteTCPConnection(Tunnel t) throws UnknownHostException, IOException { this(t, t.connectClientSocket()); + if (tunnel != null) { + t.getRtcs().add(this); + } } @Override protected void initIO() throws IOException { - dout = new DataOutputStream(new OutputMetre( connect.getOutputStream())); - din = new DataInputStream(new InputMetre(connect.getInputStream())); + + + } + protected void initIOs() throws IOException { + OutputStream outm=null; + InputStream inm=null; + if(tunnel!=null) { + outm = new OutputMetre( connect.getOutputStream(),tunnel.getOM()); + inm = new InputMetre(connect.getInputStream(),tunnel.getIM()); + }else { + outm=connect.getOutputStream(); + inm=connect.getInputStream(); + } + + new DataOutputStream(outm).writeShort(59649);//59649 + outm.flush(); + int val=new DataInputStream(inm).readShort()&0xffff; + if(val!=59649) { + throw new StreamCorruptedException(); + } + + + dout = new DataOutputStream(new AddOutputStream(new BufferedOutputStream(outm)) ); + din = new DataInputStream(new AddInputStream(new BufferedInputStream(inm))); + } - public RemoteTCPConnection(Tunnel t, Socket s) throws UnknownHostException, IOException { super(s); - this.tunnel = t; + tunnel=t; + initIOs(); s.setSoTimeout(Consts.SO_TIMEOUT); } @@ -52,11 +88,25 @@ public class RemoteTCPConnection extends TCPConnection { } + @Override + public void close() { + if (tunnel != null) { + tunnel.getRtcs().remove(this); + } + super.close(); + } + + @Override + protected void finalize() throws Throwable { + if (tunnel != null) { + tunnel.getRtcs().remove(this); + } + super.finalize(); + } + public void sendBlock(KLALBBlock data) throws IOException { dout.writeLong(data.sn); - if(data.sn!=0) { dout.writeLong(data.cuid); - } dout.writeLong(data.number); if (data.number > 0) { if (data.data == null) { @@ -83,17 +133,13 @@ public class RemoteTCPConnection extends TCPConnection { dout.flush(); - System.out.println("SEND:" + data); + //System.out.println("SEND:" + data); } public KLALBBlock receiveBlock() throws IOException { KLALBBlock klb = new KLALBBlock(); klb.sn = din.readLong(); - if(klb.sn!=0) { klb.cuid = din.readLong(); - }else { - klb.cuid=0; - } klb.number = din.readLong(); if (klb.number > 0) { int size = din.readInt(); @@ -119,7 +165,7 @@ public class RemoteTCPConnection extends TCPConnection { klb.cacheused = din.readInt(); } - System.out.println("RECEIVE:" + klb); + //System.out.println("RECEIVE:" + klb); return klb; } @@ -140,4 +186,5 @@ public class RemoteTCPConnection extends TCPConnection { public BlockingDeque getSendDeque() { return sendDeque; } + } diff --git a/src/org/kne/cloud/network/klalb/TListener.java b/src/org/kne/cloud/network/klalb/TListener.java index 8e86df9..1842175 100644 --- a/src/org/kne/cloud/network/klalb/TListener.java +++ b/src/org/kne/cloud/network/klalb/TListener.java @@ -5,5 +5,5 @@ public interface TListener { void setDelay(long delay); void setState(boolean state); - + void setTraffic(long up,long down,long ups,long downs) ; } diff --git a/src/org/kne/cloud/network/klalb/TPanel.java b/src/org/kne/cloud/network/klalb/TPanel.java index 4152f92..432dbc3 100644 --- a/src/org/kne/cloud/network/klalb/TPanel.java +++ b/src/org/kne/cloud/network/klalb/TPanel.java @@ -36,7 +36,7 @@ public class TPanel extends JPanel{ add(tname, BorderLayout.WEST); targ = new JLabel(); - targ.setFont(new Font("宋体", Font.PLAIN, 14)); + targ.setFont(new Font("宋体", Font.PLAIN, 13)); targ.setHorizontalAlignment(SwingConstants.TRAILING); targ.setForeground(Color.YELLOW); add(targ, BorderLayout.CENTER); @@ -45,28 +45,39 @@ public class TPanel extends JPanel{ setSize(570, 30); setPreferredSize(getSize()); } - private long up,down,delay; + private long up,down,ups,downs,delay; - public long getUp() { - return up; - } - public void setUp(long up) { - this.up = up; - targ.setText(up+"\u2191 "+down+"\u2193 "+delay/1000000+"ms"); - } - public long getDown() { - return down; - } - public void setDown(long down) { - this.down = down; - targ.setText(up+"\u2191 "+down+"\u2193 "+delay/1000000+"ms"); - } public long getDelay() { return delay; } public void setDelay(long delay) { this.delay = delay; - targ.setText(up+"\u2191 "+down+"\u2193 "+delay/1000000+"ms"); + updateText(); + } + private void updateText() { + targ.setText(bytesUnit(up)+"\u2191 "+bytesUnit(down)+"\u2193 "+bytesUnit(ups)+"/s\u2191 "+bytesUnit(downs)+"/s\u2193 "+delay/1000000+"ms"); + } + private String bytesUnit(long v) { + if(v>=1024L*1024*1024*1024*1024) { + return String.format("%.1f", v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"PB"; + }else if(v>=1024L*1024*1024*1024) { + return String.format("%.1f", v/(1024.0*1024.0*1024.0*1024.0))+"TB"; + }else if(v>=1024L*1024*1024) { + return String.format("%.1f", v/(1024.0*1024.0*1024.0))+"GB"; + }else if(v>=1024L*1024) { + return String.format("%.1f", v/(1024.0*1024.0))+"MB"; + }else if(v>=1024L) { + return String.format("%.1f", v/(1024.0))+"KB"; + }else { + return v+"B"; + } + } + public void setTraffic(long up2, long down2, long ups, long downs) { + up=up2; + down=down2; + this.ups=ups; + this.downs=downs; + updateText(); } } diff --git a/src/org/kne/cloud/network/klalb/Tunnel.java b/src/org/kne/cloud/network/klalb/Tunnel.java index ffc5824..357b7ef 100644 --- a/src/org/kne/cloud/network/klalb/Tunnel.java +++ b/src/org/kne/cloud/network/klalb/Tunnel.java @@ -5,16 +5,20 @@ import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Random; import java.util.Set; +import java.util.Vector; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import javax.naming.spi.Resolver; import javax.swing.JPanel; @@ -71,7 +75,7 @@ public class Tunnel{ } public String getIp() { - return getIpport().getIp().getHostAddress(); + return getIpport().getIp(); } public int getPort() { return getIpport().getPort(); @@ -83,7 +87,8 @@ public class Tunnel{ } public Socket connectClientSocket() throws UnknownHostException, IOException { Socket socket=new Socket(); - socket.connect(getIpport().getSocketAddress(), 10000); + // socket.bind(new InetSocketAddress(new Random().nextInt(65535)+1)); + socket.connect(getIpport().getSocketAddress(), Consts.CONNECT_TIMEOUT); return socket; } @@ -114,5 +119,28 @@ public class Tunnel{ this.ipport = ipport; } + private Vectorrtcs=new Vector<>(); + + public Vector getRtcs() { + return rtcs; + } + AtomicLong om=new AtomicLong(0); + AtomicLong im=new AtomicLong(0); + + long om1=0; + long im1=0; + + + public AtomicLong getOM() { + return om; + } + public AtomicLong getIM() { + return im; + } + public void updateTraffics(long timems) { + tlr.setTraffic(om.get(), im.get(), om.get()-om1, im.get()-im1); + om1=om.get(); + im1=im.get(); + } } diff --git a/src/org/kne/cloud/network/mport/IPPort.java b/src/org/kne/cloud/network/mport/IPPort.java index 3fc492c..7930ede 100644 --- a/src/org/kne/cloud/network/mport/IPPort.java +++ b/src/org/kne/cloud/network/mport/IPPort.java @@ -9,11 +9,11 @@ import java.net.UnknownHostException; import java.util.Objects; public class IPPort implements Serializable{ - private InetAddress ip; + private String ip; private int port; public IPPort(String ipport) throws UnknownHostException { int index =ipport.lastIndexOf(":"); - ip=InetAddress.getByName( ipport.substring(0,index)); + ip=ipport.substring(0,index); port=Integer.parseInt(ipport.substring(index+1)); } @@ -33,14 +33,14 @@ public class IPPort implements Serializable{ return Objects.equals(ip, other.ip) && port == other.port; } public IPPort(String ip2, int port2) throws UnknownHostException { - ip=InetAddress.getByName(ip2); + ip=ip2; port=port2; } public IPPort(InetSocketAddress remoteSocketAddress) { - ip=remoteSocketAddress.getAddress(); + ip=remoteSocketAddress.getAddress().getHostAddress(); port=remoteSocketAddress.getPort(); } - public InetAddress getIp() { + public String getIp() { return ip; } public int getPort() { @@ -48,10 +48,10 @@ public class IPPort implements Serializable{ } @Override public String toString() { - if(ip instanceof Inet6Address) { - return "["+ip.getHostAddress()+"]:"+port; + if(ip.contains(":")) { + return "["+ip+"]:"+port; } - return ip.getHostAddress()+":"+port; + return ip+":"+port; } public SocketAddress getSocketAddress() { return new InetSocketAddress(ip, port); diff --git a/src/org/kne/cloud/network/mport/PortRelay.java b/src/org/kne/cloud/network/mport/PortRelay.java index 048717f..83e6eb0 100644 --- a/src/org/kne/cloud/network/mport/PortRelay.java +++ b/src/org/kne/cloud/network/mport/PortRelay.java @@ -38,8 +38,8 @@ public class PortRelay { se = ServiceElement.getbyproc(services, n); InetSocketAddress sa=(InetSocketAddress) s.getRemoteSocketAddress(); System.out.println(sa.getAddress().getHostAddress() + ":" + port - + "-" + se.protocol + "(" + n + ")->" + se.ipport.getIp().getHostAddress() + ":" + se.ipport.getPort()); - sl.connect(new InetSocketAddress(se.ipport.getIp().getHostAddress(), se.ipport.getPort())); + + "-" + se.protocol + "(" + n + ")->" + se.ipport.getIp() + ":" + se.ipport.getPort()); + sl.connect(new InetSocketAddress(se.ipport.getIp(), se.ipport.getPort())); final DataInputStream xdinl=new DataInputStream(sl.getInputStream()); dinl=xdinl; final DataOutputStream xdoutl =new DataOutputStream(sl.getOutputStream()); diff --git a/src/org/kne/io/AddInputStream.java b/src/org/kne/io/AddInputStream.java new file mode 100644 index 0000000..ecbd26c --- /dev/null +++ b/src/org/kne/io/AddInputStream.java @@ -0,0 +1,42 @@ +package org.kne.io; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +public final class AddInputStream extends InputStream { + + volatile byte out = 0; + private InputStream in; + + @Override + public int read() throws IOException { + int read = in.read(); + if (read==-1) { + return -1; + } + out = (byte) (out+(byte) read); + return out&0xff; + } + + @Override + public void close() throws IOException { + in.close(); + } + + public AddInputStream(InputStream in) { + super(); + this.in = in; + } + + public void read(byte[][] e) throws IOException { + for (int y = 0; y