Created
October 30, 2016 06:49
-
-
Save mayli/0ecef2811aabc9ac17f9b3b4c8f5aa33 to your computer and use it in GitHub Desktop.
Java LoadBalancer - Threaded
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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