Skip to content

Instantly share code, notes, and snippets.

@mayli
Created October 30, 2016 06:49
Show Gist options
  • Save mayli/0ecef2811aabc9ac17f9b3b4c8f5aa33 to your computer and use it in GitHub Desktop.
Save mayli/0ecef2811aabc9ac17f9b3b4c8f5aa33 to your computer and use it in GitHub Desktop.
Java LoadBalancer - Threaded
package com.veryamt;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Random;
class Worker implements Runnable {
private Socket from;
private Socket to;
Worker (Socket from, Socket to) {
this.from = from;
this.to = to;
}
public void run() {
// TODO Auto-generated method stub
byte[] buf = new byte[4096];
int buf_len;
System.out.format("Redirect from %s to %s\n", from.toString(), to.toString());
try {
while ((buf_len = from.getInputStream().read(buf)) != -1) {
to.getOutputStream().write(buf, 0, buf_len);
}
to.close();
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
System.out.format("Redirect Finished from %s to %s\n", from.toString(), to.toString());
}
}
public class JavaLoadBalancer {
private int port;
private ServerSocket ss;
private ArrayList<InetSocketAddress> pool;
private int pool_index = 0;
public JavaLoadBalancer(int port, ArrayList<InetSocketAddress> pool) {
this.port = port;
this.pool = pool;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int port = 8080;
ArrayList<InetSocketAddress> pool = new ArrayList<InetSocketAddress>();
pool.add(new InetSocketAddress("192.168.1.10", 80));
pool.add(new InetSocketAddress("192.168.1.30", 80));
JavaLoadBalancer jlb = new JavaLoadBalancer(port, pool);
jlb.start();
}
private InetSocketAddress get_random_server() {
int intex = pool_index % pool.size();
pool_index += 1;
return this.pool.get(intex);
}
private void handle_client(Socket clientSocket) {
InetSocketAddress backend = get_random_server();
System.out.println("Using backend: " + backend.toString());
Socket backendSocket;
try {
backendSocket = new Socket(backend.getHostName(), backend.getPort());
} catch (UnknownHostException e1) {
System.out.println("Unable to connect backend: " + backend.toString());
return;
} catch (IOException e1) {
System.out.println("Unable to connect backend: " + backend.toString());
return;
}
System.out.println("Connected to backend: " + backendSocket.toString());
Worker c2b = new Worker(clientSocket, backendSocket);
Worker b2c = new Worker(backendSocket, clientSocket);
ArrayList<Thread> threads = new ArrayList<Thread>();
threads.add(new Thread(c2b));
threads.add(new Thread(b2c));
for(Thread thread: threads) {
thread.start();
}
// for(Thread thread: threads) {
// try {
// thread.join();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
private void start() {
try {
this.ss = new ServerSocket(port);
while (true) {
Socket clientSocket = this.ss.accept();
System.out.println("Accept client: " + clientSocket.toString());
handle_client(clientSocket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment