手动实现简单的tomcat服务器
手动实现tomcat服务器的流程:
?分析具体的实现步骤:1,浏览器和后端服务如何实现通信,首先传输的数据要遵循http协议,通过tcp也就是我们常说的套接字编程来实现,具体的底层数据传输肯定就是我们的输入输出流来实现了。 2,我们再来看后台服务器的实现逻辑,首先我们要定义两个对象,一个request,一个response分别用来存放请求的参数以及返回的参数。 3,创建一个ServerSocket,等待浏览器的连接和数据传输,当通过输入流读取到数据,放入到request对象。 4,浏览器的请求类型一般分为get和post两种,所以我们需要一个mpper映射类来根据浏览器的访问路径来分发具体处理的类或者方法。 5,处理之后获取处理的结果,并放到response对象,通过输出流返回给浏览器。 下面是具体的代码实现:1,reques类 package com.liuyi; import java.io.InputStream; public class MyRequest { //请求方法 GET/POST private String requestMethod; 请求地址 String requestUrl; public MyRequest(InputStream inputStream) throws Exception{ 缓冲区域 byte[] buffer = new byte[1024]; 读取数据的长度 int len = 0; 定义请求的变量 String str = null; if((len = inputStream.read(buffer))>0){ str = new String(buffer,0,len); } GET / HTTP/1.1 String data = str.split("n")[0]; String[] params = data.split(" "); this.requestMethod = params[0this.requestUrl = params[1]; } public String getRequestMethod() { return requestMethod; } void setRequestMethod(String requestMethod) { this.requestMethod = String getRequestUrl() { requestUrl; } setRequestUrl(String requestUrl) { this.requestUrl = requestUrl; } } 2,response类 java.io.OutputStream; MyResponse { OutputStream outputStream; MyResponse(OutputStream outputStream) { this.outputStream = outputStream; } void write(String str) Exception{ StringBuilder builder = new StringBuilder(); builder.append("HTTP/1.1 200 OKn") .append("Content-Type:text/htmln") .append("rn") .append("<html>") .append("<body>") .append("<h1>"+str+"</h1>") .append("</body>") .append("</html>"this.outputStream.write(builder.toString().getBytes()); .outputStream.flush(); .outputStream.close(); } } 3,Mapping类,定义请求路径和请求处理类的关系 java.util.HashMap; MyMapping { static HashMap<String,String> mapping = new HashMap<String,String>(); static { 4,定义HpptServlet抽象类,实现get和post的分发(根据不同的请求方式调用不同的方法进行处理) com.mashibing; abstract MyHttpServlet { 定义常量 static final String METHOD_GET = "GET"; final String METHOD_POST = "POST"; void doGet(MyRequest request,MyResponse response) Exception; void doPost(MyRequest request,1)"> Exception; /** * 根据请求方式来判断调用哪种处理方法 * @param request * response */ void service(MyRequest request,1)">if(METHOD_GET.equals(request.getRequestMethod())){ doGet(request,response); }else (METHOD_POST.equals(request.getRequestMethod())){ doPost(request,response); } } } 5,定义自己的servlet class MyServlet extends MyHttpServlet{ @Override Exception { response.write("mytomcat get"); } @Override Exception { response.write("post tomcat"); } } 6,定义服务端的接受程序,接受socket请求 java.io.InputStream; java.io.OutputStream; java.net.ServerSocket; java.net.Socket; MyServer { * 定义服务端的接受程序,接受socket请求 * port void startServer(int port) Exception{ 定义服务端套接字 ServerSocket serverSocket = ServerSocket(port); 定义客户端套接字 Socket socket = while (true){ socket = serverSocket.accept(); 获取输入流和输出流 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); 定义请求对象 MyRequest request = MyRequest(inputStream); 定义响应对象 MyResponse response = MyResponse(outputStream); String clazz = MyMapping().getMapping().get(request.getRequestUrl()); if(clazz!=){ Class<MyServlet> myServletClass = (Class<MyServlet>)Class.forName(clazz); 根据myServletClass创建对象 MyServlet myServlet = myServletClass.newInstance(); myServlet.service(request,response); } } } 运行启动 main(String[] args) { try { startServer(10086); } catch (Exception e) { e.printStackTrace(); } } } 总结:本案例只是实现了简单的tomcat和servlet,仅仅只是为了让我们学习servlet和tomcat没有那么多的疑惑,学起来会更容易。实际工作中当然也不会这样去写, 但是如果你认值把这个代码敲一遍,并理解为什么这样写,那么对你学习java web肯定会有很大的帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |