web服务器系列(二)

原创
2016/03/10 13:51
阅读数 44

                                                                web服务器系列(二)

    java web的基础就是Servlet,那么问题来了我们怎么通过Web服务器去实现支持有关Servlet的请求呢?这里实现一个简单的思路。

    

    
    //一个可以响应Servlet的服务器
    public class HttpServletServer {
	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[]) {
		HttpServletServer httpServer = new HttpServletServer();
		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().startsWith("/servlet/")){ 
					System.out.println("come in");
					ServletProcessor processor=new ServletProcessor(); 
					processor.process(request,response);
				}else{
					StaticResourceProcessor processor=new StaticResourceProcessor();
					processor.process(request,response);
				}
				input.close();
				socket.close();
				shutdown = request.getUri().equals(SHOYDOWN_COMMAND);

			} catch (Exception e) {
				e.printStackTrace();
				continue;

			}
		}

	}

    }
    
    //对静态资源的处理
    public class StaticResourceProcessor {
	public void process(Request request, Response response) {
		try {
			response.sendStaticResourse();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
    }
    
    //对servlet请求进行处理
    public class ServletProcessor {
	public void process(Request request,Response response){
		String uri=request.getUri();
		String servletName=uri.substring(uri.lastIndexOf("/")+1);
		MyClassLoader myClass= new MyClassLoader();
		Class<?> clazz = null;
		try {
		        //根据反射实例化一个对象,这个是最基本的实现有很大改进空间
			clazz = myClass.loadClass("D:\\项目开发\\项目开发7\\web server\\webroot\\"+servletName+".class");
		} catch (ClassNotFoundException e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}
		Servlet servlet=null;
		try{
			servlet=(Servlet)clazz.newInstance();
			servlet.service((ServletRequest)request, (ServletResponse)response);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	static class MyClassLoader extends ClassLoader {
        @Override
        public Class<?> findClass(String name) {
            try {
                FileInputStream in = new FileInputStream(name);
                ArrayList<Byte> l = new ArrayList<Byte>();
                int c;
                while ((c = in.read()) != -1) {
                    l.add(new Byte((byte)c));
                }
                byte[] b = new byte[l.size()];
                for (int i = 0; i < l.size(); i++) {
                    b[i] = l.get(i).byteValue();
                }
                
                return defineClass(b, 0, b.length);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        }
    }
    
    //实现Servlet规范
    public class PrimitiveServlet implements Servlet{

	@Override
	public void destroy() {
		System.out.println("destroy");
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO 自动生成的方法存根
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO 自动生成的方法存根
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init");
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		System.out.println("from service");
		PrintWriter out=arg1.getWriter();
		out.println("hello! im back!");
		out.println("heihei!!!");
		
	}

    }
    
    public class Request implements ServletRequest {

	private InputStream input;
	
	private String uri;
	
	public Request(InputStream input) {
		this.input=input;
	}
	
	public String getUri(){
		return uri;
	}
	
	//这个解析的内容还是太少了
	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 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()));
	}
	。。。。。。。。。很多不重要的
	}
	
	public class Response implements ServletResponse{

	
        private static final int BUFFER_SIZE=1024;
	PrintWriter writer;
	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();
		}
	}
	。。。。。省略很多不要的
    }

    感觉其实很好实现Servlet类型。如果搞懂了设计思路的话。

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