web服务器系列(一)

原创
2016/03/09 20:47
阅读数 105

                                                                   web服务器系列(一)

    前两天想要弄一个分析Servlet系列的文章,结果发现自己有点驾驭不住,追根溯底是web 服务器的实现原理搞的不够清楚。思来想去,还是要先把web服务器原理解析一下,再接着分析Servlet系列。 

    //一个最简单的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\n"+
									"Content-Type :text/html\r\n"+
									"Content-length 23\r\n"+
									"\r\n"+
									"<h1>File Not Found</h1>";
				output.write(errorMessage.getBytes());
				output.close();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			if(fis!=null)
			fis.close();
		}
	}
    }

                        

展开阅读全文
打赏
1
4 收藏
分享
加载中
更多评论
打赏
0 评论
4 收藏
1
分享
返回顶部
顶部