package org.kne.cloud.network.klalb; import java.io.DataInputStream; import java.io.IOException; import java.net.ConnectException; import java.net.Socket; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.WeakHashMap; public class KLALBServer { WeakHashMap whm=new WeakHashMap<>(); public KLALBServer(int port, Map services,List tunnels) throws IOException { TCPListener tcpl=new TCPListener(port); tcpl.setCon((s)->{ try { //s.setSoTimeout(10000); TCPConnection tcc=new TCPConnection(null,s); DataInputStream din=tcc.getDin(); int val=din.readShort()&0xffff; if(val!=59649) { return; } int x=din.read(); if(x==0) { synchronized (services) { tcc.getDout().writeInt(services.size()); Collection cll=services.values(); for (Iterator iterator = cll.iterator(); iterator.hasNext();) { ServiceElement tunnel = iterator.next(); tcc.getDout().writeUTF(tunnel.toString()); } } synchronized (tunnels) { int counts=tunnels.size(); tcc.getDout().writeInt(counts); for (int i = 0; i < counts; i++) { tcc.getDout().writeUTF(tunnels.get(i).toString()); } } tcc.getDout().flush(); return; } String lip=din.readUTF(); int lport=din.readInt(); String lname=din.readUTF(); ServiceElement eas=services.get(lname); System.out.println(eas); if(eas==null||(!eas.ipport.equals(new IPPort(lip, lport)))){ return; } String name = din.readUTF(); String ip = din.readUTF(); int portx=din.readInt(); Tunnel tll=Tunnel.newTunnel(name, ip, portx); tcc.setTunnel(tll); UUID uid=new UUID(din.readLong(),din.readLong()); System.out.println("隧道连接:"+tll); IOThreadManager nx = null; if(whm.containsKey(uid)) { nx=whm.get(uid); }else { nx=new IOThreadManager(); Socket soc=new Socket("192.168.1.233",eas.ipport.getPort()); nx.setLocal(new TCPConnection(null, soc)); nx.startLocal(); whm.put(uid, nx); } nx.handleSocket(tcc); int n=nx.getTcps().size(); if(n<=0) { nx.closeLocal(); System.out.println("连接已关闭"); } }catch(ConnectException e) { System.out.println("连接本地服务失败,请检查你的服务程序"); }catch(IOException e) { e.printStackTrace(); }finally { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } }); tcpl.open(); } /*public static void main(String[] args) throws IOException { KLALBServer kc=new KLALBServer(4569); }*/ }