This commit is contained in:
Administrator
2022-12-27 17:38:49 +08:00
parent 6dd349e722
commit c791720f95
18 changed files with 292 additions and 67 deletions
+3 -2
View File
@@ -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;
}
@@ -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
Collection<LocalTCPConnection>ltcc= klc.getLocaltcps().values();
synchronized ( klc.getLocaltcps()) {
for (Iterator iterator = ltcc.iterator(); iterator.hasNext();) {
LocalTCPConnection localTCPConnection = (LocalTCPConnection) iterator.next();
localTCPConnection.close();
}
}
List<RemoteTCPConnection>rtcc= klc.getRemotetcps();
synchronized (rtcc) {
for (Iterator iterator = rtcc.iterator(); iterator.hasNext();) {
RemoteTCPConnection remoteTCPConnection = (RemoteTCPConnection) iterator.next();
remoteTCPConnection.close();
}
}
}
public boolean isOpen() {
@@ -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();
}
}
@@ -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<<Math.min(re,8)));
Thread.sleep(1000*(1<<Math.min(re,7)));
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -193,6 +193,13 @@ public class KLALBClientGUI extends XFrame {
}
repaint();
}
@Override
public void setTraffic(long up, long down, long ups, long downs) {
tp.setTraffic(up,down,ups,downs);
repaint();
}
});
}
ysp.updateUI();
@@ -217,6 +224,13 @@ public class KLALBClientGUI extends XFrame {
while(true) {
Thread.sleep(999);
List<Tunnel>ts=kc.getTls();
synchronized(ts) {
for(int i=0;i<ts.size();i++) {
Tunnel t=ts.get(i) ;
t.updateTraffics(1000);
}
}
}
} catch (ConnectException e) {
@@ -228,6 +242,7 @@ public class KLALBClientGUI extends XFrame {
if(kc!=null) {
kc.close();
}
wv.removeAll();
}
} else {
@@ -97,7 +97,6 @@ public class KLALBCore {
for(;;) {
if(tc.checkPingTime()) {
KLALBBlock pdb=new KLALBBlock();
pdb.sn=0;
pdb.cuid=0;
pdb.number=0;
pdb.command=0;
@@ -118,7 +117,7 @@ public class KLALBCore {
KLALBBlock brc=null;
for(;;) {
brc=tc.receiveBlock();
if(brc.sn==0||brc.number!=0) {
if(brc.number!=0) {
break;
}
SN s=new SN(brc.sn);
@@ -145,7 +144,6 @@ public class KLALBCore {
if(brc.number==0) {
if(brc.command==0) {
KLALBBlock pdb=new KLALBBlock();
pdb.sn=0;
pdb.cuid=0;
pdb.number=0;
pdb.command=1;
@@ -220,7 +218,7 @@ public class KLALBCore {
for (Iterator<RemoteTCPConnection> iterator = remotetcps.iterator(); iterator.hasNext();) {
RemoteTCPConnection remoteTCPConnection = (RemoteTCPConnection) iterator.next();
BlockingDeque<KLALBBlock> bdq=remoteTCPConnection.getSendDeque();
if(bdq.size()<1) {
if(bdq.size()<2) {
bdq.add(kb);
return;
}
@@ -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();
@@ -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<UUID, IOThreadManager> whm=new WeakHashMap<>();
Map<UUID, IOThreadManager> whm=new WeakHashMap<UUID, IOThreadManager>();
public KLALBServer(int port,Supplier<String> 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;
@@ -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();
}
}
@@ -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<KLALBBlock> getSendDeque() {
return sendDeque;
}
}
@@ -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) ;
}
+28 -17
View File
@@ -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();
}
}
+30 -2
View File
@@ -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 Vector<RemoteTCPConnection >rtcs=new Vector<>();
public Vector<RemoteTCPConnection> 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();
}
}
+8 -8
View File
@@ -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);
@@ -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());
+42
View File
@@ -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<e.length; y++) {
byte tmp[] = e[y];
for (int x = 0; x<tmp.length; x++) {
tmp[x] = (byte) read();
}
}
}
}
+41
View File
@@ -0,0 +1,41 @@
package org.kne.io;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
public class AddOutputStream extends OutputStream {
volatile byte out=0;
private OutputStream o;
@Override
public void close() throws IOException {
o.close();
}
@Override
public void flush() throws IOException {
o.flush();
}
public AddOutputStream(OutputStream o) {
super();
this.o = o;
}
@Override
public void write(int b) throws IOException {
o.write((((byte)b)-out)&0xff);
out=(byte) b;
}
public void write(byte[][]e) throws IOException{
for (int y = 0; y < e.length; y++) {
byte tmp[]=e[y];
//System.out.println(Arrays.toString(tmp));
for (int x = 0; x < tmp.length; x++) {
write(tmp[x]&0xFF);
}
}
}
}