使用ExcutorService管理的web服务器结构

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 一个简单服务器的基本框架,使用线程池来处理请求
* 可以通过stop方法来关闭,也可以使用发送关闭请求来关闭。
* @author 王法波
* @version 1.0
*/
public class LifecycleWebServer {

/**
* 线程池
*/
private final ExecutorService exec;
/**
* 服务器socket
*/
private final ServerSocket ss;

/**
* 内部类Request,在框架中用来封装用户的请求,未实现
*/
class Request {
}

/**
* 构造函数,可以通过参数来指定服务器端口和线程池大小
*
* @param port      服务器端口
* @param poolsize 线程池大小
* throw IOException 建立ServerSocket失败的时候回抛出该异常
*/
public LifecycleWebServer(int port, int poolsize) throws IOException {
   exec = Executors.newFixedThreadPool(poolsize);
   ss = new ServerSocket(port);
}

/**
* 启动服务器的方法

* @throws IOException 接受连接的时候可能会产生该异常
*/
public void start() throws IOException {
   while (!exec.isShutdown()) {
    final Socket s = ss.accept();
    exec.execute(new Runnable() {
     public void run() {
      handleRequest(s);
     }
    });
   }
}
/**
* 处理请求,如果该方法为关闭请求,就关闭服务器,否则,调用dispacheRequest来处理请求
*
* @param s y要处理的Socket对象
*/
private void handleRequest(Socket s) {
   Request req = readRequest(s);
   if (isShtdownRequest(req))
    stop();
   else
    dispacheRequest(req);
}
/**
* 实际处理代码,未实现
*/
private void dispacheRequest(Request req) {

}
/**
* 判断连接是否为关闭请求,方法未实现
*/

private boolean isShtdownRequest(Request req) {

   return false;
}
/**
* 从socket中读取请求
*/
private Request readRequest(Socket s) {

   return null;
}
/**
* 关闭服务器
*/
private void stop() {
   exec.shutdown();
}
}

posted @ 2010-03-12 22:29  macula7  阅读(351)  评论(0)    收藏  举报