程序基本流程如下:
代码组织结构如下:
HTTP重定向服务主线程:
package com.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.log4j.Logger;
import com.conf.Config;
public class HttpServer implements Runnable {
private static ServerSocket server_socket = null;
private static ExecutorService pool;
private static int requestNum = 0;
private static Logger serverLog = Logger.getLogger("HttpServerLog");
private static Logger requestNumLog = Logger.getLogger("RequestNumber");
public void run() {
startServer(Config.serverListenPort);
}
private void startServer(int port){
try {
pool = Executors.newFixedThreadPool(Config.threadPoolSize);
server_socket = new ServerSocket(port,Config.serverQueueSize);
serverLog.info("HTTP Server starts on port:"
+ server_socket.getLocalPort());
while (true) {
try {
if(Config.curThreadsNum.get() >= Config.maxThreadsNum.get()){
serverLog.info("HTTP Server sleep for 1 second!");
Thread.sleep(1000);
continue;
}
} catch (Exception e) {
serverLog.error(e);
continue;
}
serverLog.debug("Get client request!");
Socket socket = server_socket.accept();
serverLog.debug("Create socket successfully!");
//socket.setReuseAddress(true);
//某些HTTP客户端建立连接后不发送数据
//如果这种连接过多,系统线程将被耗尽
//所以必须设置连接超时时间
socket.setSoTimeout(2*1000);
socket.setSoLinger(true, 0);
serverLog.debug("New connection:" + socket.getInetAddress()
+ ":" + socket.getPort());
serverLog.info("Max:" + Config.maxThreadsNum
+ ";Cur:" + Config.curThreadsNum);
requestNum++;
if(requestNum > 10000){
requestNumLog.info("10000 requests");
requestNum = 0;
}
try {
DealThread dt = new DealThread(socket);
serverLog.debug("Deal thread create successfully!");
pool.execute(dt);
Config.curThreadsNum.incrementAndGet();
} catch (Exception e) {
serverLog.error(e);
}
}
} catch (IOException e) {
serverLog.error(e);
}
}
public static void main(String[] args){
HttpServer hs = new HttpServer();
Thread t = new Thread(hs);
t.start();
}
}
HTTP请求封装类: