package com.xiaomi.dbproxy.action;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.List;
import java.util.Random;
import com.xiaomi.dbproxy.model.proxyServer;
import com.xiaomi.dbproxy.model.proxyService;
import com.xiaomi.dbproxy.tools.Log;
public class tcpProxy implements Runnable {
proxyServer server;
Random rand = new Random(new Date().getTime());
public tcpProxy(){}
public tcpProxy(proxyServer server) {
this.server = server;
}
public static Socket getSocket(List<proxyService> list){
Socket outgoing = null;
for(proxyService item : list){
try{
if(item.cantry()){
outgoing = new Socket(item.getHost(), item.getPort());
}else{
continue;
}
return outgoing;
}catch(Exception e){
item.setEcount();
continue;
}
}
return null;
}
@Override
public void run() {
ServerSocket ss = null;
Socket incoming, outgoing = null;
try {
ss = new ServerSocket(this.server.getPort());
} catch (Exception e) {
Log.logError(e);
}
int index = 0;
int len = this.server.getList().size();
while (true) {
try {
incoming = ss.accept();
proxyService ps = this.server.getList().get(index);
try{
if(ps.cantry()){
outgoing = new Socket(ps.getHost(), ps.getPort());
}else{
outgoing = tcpProxy.getSocket(this.server.getList());
}
}catch(Exception ex){
ps.setEcount();
outgoing = tcpProxy.getSocket(this.server.getList());
}
if(outgoing==null||!outgoing.isConnected()){
throw new Exception("server: "+this.server.getPort()+" can't connect service");
}
proxyThread thread1 = new proxyThread(incoming, outgoing);
proxyThread thread2 = new proxyThread(outgoing, incoming);
thread1.start();
thread2.start();
} catch (Exception e) {
Log.logError(e);
}finally{
index++;
if(index>=len){
index=0;
}
}
}
}
public proxyServer getServer() {
return server;
}
public void setServer(proxyServer server) {
this.server = server;
}
}
package com.xiaomi.dbproxy.action;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import com.xiaomi.dbproxy.tools.Log;
import com.xiaomi.dbproxy.tools.proxyConfig;
public class proxyThread extends Thread {
Socket incoming, outgoing;
public proxyThread(Socket in, Socket out) {
incoming = in;
outgoing = out;
}
public void run() {
byte[] buffer = new byte[proxyConfig.IO_BUFFER];
int numberRead = 0;
OutputStream ToClient;
InputStream FromClient;
try {
ToClient = outgoing.getOutputStream();
FromClient = incoming.getInputStream();
while (true) {
numberRead = FromClient.read(buffer, 0, proxyConfig.IO_BUFFER);
if (numberRead == -1) {
incoming.close();
outgoing.close();
}
ToClient.write(buffer, 0, numberRead);
}
} catch (Exception e) {
Log.logError(e);
}
}
}