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();
}
}