Webサーバシリーズ(一)

3601 ワード

Webサーバシリーズ(一)
先日サーブレットシリーズを分析しようとしたところ、自分が少しコントロールできないことに気づき、Webサーバの実現原理がはっきりしていないことに気づいた.考えてみれば、まずwebサーバの原理を解析してから、サーブレットシリーズを分析します. 
    //      web    
    public class HttpServer {
	public  static final String Web_Root=System.getProperty("user.dir")+File.separator+"webroot"        ;
	
	public  static final String SHOYDOWN_COMMAND="/SHUTDOWN";
	
	private boolean shutdown=false;
	public static void main(String args[]){
		HttpServer httpServer=new HttpServer();
		httpServer.await();
	}
	
	public void await(){
		ServerSocket serverSocket=null;
		int port=8080;
		try{
			serverSocket=new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
		}catch(IOException e){
			e.printStackTrace();
			System.exit(1);
		}
		while(!shutdown){
			Socket socket=null;
			InputStream input=null;
			OutputStream output=null;
			try{
				socket=serverSocket.accept();
				input =socket.getInputStream();
				output=socket.getOutputStream();
				System.out.println(input.available());
			
				Request request=new Request(input);
				request.parse();
				
				Response response=new Response(output);
				response.setRequest(request);
				response.sendStaticResourse();
				if(request.getUri()!=null){
					shutdown=request.getUri().equals(SHOYDOWN_COMMAND);
				}
				input.close();
				socket.close();
		
			
			}catch(Exception e){
				e.printStackTrace();
				continue;
				
			}
		}
		
	}
    }
    
    //       ,       url    
    public class Request {
	private InputStream input;
	
	private String uri;
	
	public Request(InputStream input){
		this.input=input;
	}
	
	public void parse(){
		StringBuffer request=new StringBuffer(2048);
		int i;
		byte[] buffer=new byte[2048];
		try{
			i=input.read(buffer);
		}catch(IOException e){
			e.printStackTrace();
			i=-1;
		}
		for(int j=0;j<i;j++){
			request.append((char)buffer[j]);
		}
		System.out.println(request.toString());
		uri=parseUri((request.toString()));
	}
	//            
	private String parseUri(String requestString){
		int index1,index2;
		index1=requestString.indexOf(' ');
		if(index1!=-1){
			index2=requestString.indexOf(' ',index1+1);
			if(index2>index1){
				return requestString.substring(index1+1,index2);
			}
		}
		return null;
	}
	
	public String getUri(){
		return uri;
	}
    }
    
    //         
    
    public class Response {
	private static final int BUFFER_SIZE=1024;
	
	Request request;
	OutputStream output;
	
	public Response(OutputStream output){
		this.output=output;
	}
	
	public void setRequest(Request request){
		this.request=request;
	}
	
	public void sendStaticResourse()throws IOException{
		byte[] bytes=new byte[BUFFER_SIZE];
		FileInputStream fis=null;
		try{
			System.out.println(request.getUri());
			File file = null;
			if(request.getUri()!=null){
				file=new File(HttpServer.Web_Root,request.getUri());
			}
			if(file!=null&&file.exists()){
				fis=new FileInputStream(file);
				int ch=fis.read(bytes, 0, BUFFER_SIZE);
				while(ch!=-1){
					output.write(bytes,0,ch);
					ch=fis.read(bytes, 0, BUFFER_SIZE);
				}
				fis.close();
				output.close();
			}
			else{
				String errorMessage="HTTP/1.1 404 File Not Found\r
"+ "Content-Type :text/html\r
"+ "Content-length 23\r
"+ "\r
"+ "<h1>File Not Found</h1>"; output.write(errorMessage.getBytes()); output.close(); } }catch(Exception e){ e.printStackTrace(); } finally{ if(fis!=null) fis.close(); } }     }