自寫Tomcat服務器

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServletServer {
	private ServerSocket serverSocket;
	private int port;
	private boolean shutDown;
	
	public ServletServer(int port) {
		this.port = port;
	}
	
	public void startServer() {
		try {
			serverSocket = new ServerSocket(port);
		} catch (IOException e) {
			System.out.println("監聽"+port+"失敗");
			System.exit(0);
		}
		while (!shutDown) {
			//等待客戶端鏈接
			try {
				Socket socket = serverSocket.accept();
				DispatchSocket dispatchSocket = new DispatchSocket(socket);
				new Thread(dispatchSocket).start();
			} catch (IOException e) {
				System.out.println("客戶端出問題了");
			}
			//建立一個線程處理客戶端鏈接進來的請求
		}
	}

	public static void main(String[] args) {
		ServletServer server = new ServletServer(8080);
		server.startServer();
	}
	
	public boolean isShutDown() {
		return shutDown;
	}

	public void setShutDown(boolean shutDown) {
		this.shutDown = shutDown;
	}	
}


import java.io.IOException;
import java.net.Socket;

public class DispatchSocket implements Runnable {
	private Socket socket;

	public DispatchSocket(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			System.out.println("客戶端是:" + socket.getRemoteSocketAddress());
			// 獲取客戶端發送給服務器的數據的輸入流
			Request request = new Request(socket.getInputStream(), 8080);
			Response response = new Response(socket.getOutputStream());
			WebApp webApp = WebApp.getWebApp();
			String urlPattern = request.getUrlPattern();
			ServletMapping mapping = webApp.getServletMappings().get(urlPattern);
			if (mapping != null) {
				String servletName = mapping.getServletName();
				Servlet servlet = webApp.getServletContext().getServlet(servletName);
				if (servlet != null) {
					servlet.service(request, response);
				} else {
					response.println("沒有得到Servlet");
				}
			} else {
				response.print("你請求的url錯誤,該url不正確。沒有找到相應的頁面!");
			}
		} catch (IOException e) {
		}finally{
			closeSocket(socket);
		}
	}

	private void closeSocket(Socket socket) {
		if (socket != null) {
			try {
				socket.getOutputStream().flush();
				socket.close();
			} catch (IOException e) {
			}
		}
	}
}


import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * 瀏覽器請求服務器
 */
public class Request {
	private int port;   //服務器端口號
	private String host;   //請求服務器的地址
	private String urlPattern;   //請求的url相對路徑
	private Map map = new HashMap();   //請求中的數據
	private String method;   //請求的方式
	private String headInfo;  //請求頭信息
	private InputStream inStream;
	
	protected Request(InputStream inStream,int port){
		this.inStream = inStream;
		this.port = port;
		parseRequestHead();  //解析請求頭信息
	}

	private void parseRequestHead() {
		byte[] buf = new byte[1024];
		try {
			inStream.read(buf);
			headInfo = new String(buf);
			System.out.println(headInfo);
			method = headInfo.substring(0,headInfo.indexOf("/")).trim();
			System.out.println("請求方式:"+method);
			host = headInfo.substring(headInfo.indexOf("Host:")+5,headInfo.indexOf(":"+port)).trim();
			System.out.println("請求地址:"+host);
			if (method.equalsIgnoreCase("get")) {
				parseGetString();
			} else if (method.equalsIgnoreCase("post")) {
				parsePostString();
			}
		} catch (IOException e) {
		}
		
	}

	/**
	 * post請求解析方法
	 */
	private void parsePostString() {
		urlPattern = headInfo.substring(5,headInfo.indexOf("HTTP/")).trim();
		String dataString = headInfo.substring(headInfo.indexOf("\r\n")).trim();
		StringTokenizer st = new StringTokenizer(dataString,"&");
		while (st.hasMoreElements()) {
			String[] ss = st.nextToken().split("=");
			map.put(ss[0], ss[1]);
		}
	}

	/**
	 * get請求解析方法
	 */
	private void parseGetString() {
		String url = headInfo.substring(4,headInfo.indexOf("HTTP/"));
		if (url.indexOf("?")==-1) {
			urlPattern = url.trim();
		} else {
			urlPattern = url.substring(0,url.indexOf("?")).trim();
			String dataString = url.substring(url.indexOf("?")+1).trim();
			StringTokenizer st = new StringTokenizer(dataString,"&");
			while (st.hasMoreElements()) {
				String[] ss = st.nextToken().split("=");
				map.put(ss[0], ss[1]);
			}
		}
	}

	/**
	 * 根據名字得到參數
	 */
	public String getParameter(String name){
		if (map!=null&&map.size()>0) {
			return (String) map.get(name);
		}
		return null;
	}
	
	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getUrlPattern() {
		return urlPattern;
	}

	public void setUrlPattern(String urlPattern) {
		this.urlPattern = urlPattern;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public String getHeadInfo() {
		return headInfo;
	}

	public void setHeadInfo(String headInfo) {
		this.headInfo = headInfo;
	}
}

import java.io.IOException;
import java.io.OutputStream;

/**
 * 服務器響應瀏覽器
 */
public class Response {
	private OutputStream outStream;
	
	protected Response(OutputStream outStream){
		this.outStream = outStream;
	}
	
	public void print(String info) {
		try {
			outStream.write(info.getBytes());
		} catch (IOException e) {
		}
	}
	
	public void println(String info) {
		try {
			outStream.write((info+"\r\n").getBytes());
		} catch (IOException e) {
		}
	}
}



import java.util.HashMap;
import java.util.Map;

public class ServletContext {
	//容器,裝載項目中全部的Servlet,key爲servlet-name,value爲Servlet實例
	private Map<String, Servlet> context = new HashMap<String, Servlet>();
	
	public Map<String , Servlet> getContext() {
		return context;
	}
	
	public void setContext(Map<String , Servlet> context){
		this.context = context;
	}
	
	//根據Servlet名字得到Servlet
	public Servlet getServlet(String servletName) {
		if (context != null) {
			return context.get(servletName);
		}
		return null;
	}	
}

import java.util.HashMap;
import java.util.Map;

public class ServletContext {
	//容器,裝載項目中全部的Servlet,key爲servlet-name,value爲Servlet實例
	private Map<String, Servlet> context = new HashMap<String, Servlet>();
	
	public Map<String , Servlet> getContext() {
		return context;
	}
	
	public void setContext(Map<String , Servlet> context){
		this.context = context;
	}
	
	//根據Servlet名字得到Servlet
	public Servlet getServlet(String servletName) {
		if (context != null) {
			return context.get(servletName);
		}
		return null;
	}	
}



public class ServletMapping {
	private String servletName;
	private String urlPattern;

	public ServletMapping(String servletName, String urlPattern) {
		this.servletName = servletName;
		this.urlPattern = urlPattern;
	}

	public String getServletName() {
		return servletName;
	}

	public void setServletName(String servletName) {
		this.servletName = servletName;
	}

	public String getUrlPattern() {
		return urlPattern;
	}

	public void setUrlPattern(String urlPattern) {
		this.urlPattern = urlPattern;
	}
}



import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

public class WebApp {
	private static WebApp webApp = new WebApp();
	//根目錄
	private static String WEB_ROOT = "D:\\share\\JavaProjects\\servletWorkspace\\lss03\\WebRoot\\";
	private ServletContext servletContext;
	//key表示urlPattern,value表示ServletMapping
	private Map<String, ServletMapping> servletMappings = new HashMap<String, ServletMapping>();
	
	private WebApp(){
		parseWebXml();
	}

	public static WebApp getWebApp(){
		return webApp;
	}
	
	private void parseWebXml() {
		SAXBuilder builder = new SAXBuilder();
		try {
			Document doc = builder.build(new File(WEB_ROOT+"WEB=INF/web.xml"));
			XPath xPath = XPath.newInstance("//servlet");
			servletContext = new ServletContext();
			List list = xPath.selectNodes(doc.getRootElement());
			for (Iterator i = list.iterator();i.hasNext();) {
				Element e = (Element) i.next();
				String servletName = e.getChildText("servlet-name");
				String servletClass = e.getChildText("servlet-class");
				Servlet servlet = (Servlet) Class.forName(servletClass).newInstance();
				servletContext.getContext().put(servletName,servlet);
			}
			xPath = XPath.newInstance("//servlet-mapping");
			List mappings = xPath.selectNodes(doc.getRootElement());
			for (Iterator i = mappings.iterator(); i.hasNext();) {
				Element e = (Element) i.next();
				String servletName = e.getChildText("servlet-name");
				String urlPattern = e.getChildText("url-pattern");
				ServletMapping mapping = new ServletMapping(servletName, urlPattern);
				servletMappings.put(urlPattern, mapping);
			}
		} catch (Exception e) {
		}
	}

	public ServletContext getServletContext() {
		return servletContext;
	}

	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}

	public Map<String, ServletMapping> getServletMappings() {
		return servletMappings;
	}

	public void setServletMappings(Map<String, ServletMapping> servletMappings) {
		this.servletMappings = servletMappings;
	}
}



public abstract class Servlet {
	//處理請求
	public abstract void service(Request request,Response response);
}



import java.text.SimpleDateFormat;
import java.util.Date;

public class TestServlet extends Servlet {
	private static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public void service(Request request, Response response) {
		String html = "<html><head><meta http-equiv=\"Content-Type\"content=\"text/html;charset=gbk\"/>" + "</head><body><h2>通訊服務測試信息</h2><h2>服務器當前時間是:" + SDF.format(new Date())
				+ "</h2></body></html>";
		response.print(html);
	}
}
相關文章
相關標籤/搜索