Я студент университета, который любит делать что-то новое с программированием.
Недавно я сделал балансировщик нагрузки с java для удовольствия.
И я наконец-то познакомился с некоторыми проблема.
Когда запрос от клиента имеет заголовок keep-alive, клиент или внутренний сервер не отправляют сообщение о закрытии tcp. Таким образом, балансировщик нагрузки заблокирован для функции read ().
Какова наилучшая практика для решения такого рода проблем?
Я хочу, чтобы этот балансировщик нагрузки мудро поддерживал протокол HTTP.
public class Connection implements Runnable {
private Socket cliSock;
private Info serverInfo;
private Socket servSock;
public Connection(Socket cliSock, Info info){ // info has backend server's IP and Port number.
this.cliSock = cliSock;
this.serverInfo = info;
}
@Override
public void run(){
InputStream clientIn;
OutputStream clientOut;
InputStream serverIn;
OutputStream serverOut;
try{
servSock = new Socket(serverInfo.getIp(), serverInfo.getPort());
clientIn = cliSock.getInputStream();
clientOut = cliSock.getOutputStream();
serverIn = servSock.getInputStream();
serverOut = servSock.getOutputStream();
}catch(Exception e){
}
// IO bridging
Thread clientToServer = new Thread(new IoBridge(this, clientIn, serverOut));
Thread serverToClient = new Thread(new IoBridge(this, serverIn, clientOut));
clientToServer.start();
serverToClient.start();
log.info("Forwading started");
}
class IoBridge implements Runnable{
private static final int BUFFER_SIZE = 1024;
private InputStream in;
private OutputStream out;
private Connection con;
IoBridge(Connection con, InputStream in, OutputStream out){
this.in = in;
this.out = out;
this.con = con;
}
@Override
public void run(){
byte[] buffer = new byte[BUFFER_SIZE];
try{
while(true){
int byteRead = in.read(buffer); // blocking...
if(byteRead == -1){
break;
}
out.write(buffer, 0, byteRead);
out.flush();
}
}catch(IOException e){
}
con.closeConnection();
}