这是目前的理解
附上服务端源码
package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMap; import java.util.Map; /* * 关于服务器,除了httpServer1类,还定义了一个Servlet接口,这个接口有一个init()和一个service()方法 * init()方法为初始化方法,当HTTPServer1类创建了该接口的类的一个实例后,就会立即调用该实例的init()方法 * service()方法:用户响应HTTP的请求,产生具体的HTTP响应结果。 * HTTPServer1服务器在响应HTTP请求时会调用servlet接口的特定类的service()方法 * 所谓web服务器动态执行程序代码。在这个例子中就是指httpServer1在运行时动态加载Servlet接口的实现类,创建他的实例。然后调用他的相关方法。 * HTTPServer1在其实现中利用了java语言的动态加载类的功能 */ //动态执行 public class HTTPServer1 { //存放selvlet实例的缓存 private static Map servletCache = new HashMap(); public static void main(String[] args){ int port; ServerSocket serverSocket; try{ port = Integer.parseInt(args[0]); System.out.println("默认端口是: " + port); } catch(Exception e){ System.out.println("默认端口8080"); port = 8080; } try{ //创建监听端口 serverSocket = new ServerSocket(port); System.out.println("服务器正在监听端口: " + serverSocket.getLocalPort()); while(true){ try{ //等待客户的链接请求 final Socket socket = serverSocket.accept(); System.out.println("建立了一个与客户的新的TCP连接,该客户的地址为: " + socket.getInetAddress() + " 端口为 : " + socket.getPort()); //响应客户请求 service(socket); } catch(Exception e){ e.printStackTrace(); } } } catch(Exception e){ e.printStackTrace(); } } public static void service(Socket socket) throws Exception{ //读取HTTP请求信息 InputStream socketIn = socket.getInputStream(); //获得输入流 //睡眠500毫秒,等待http请求 Thread.sleep(500); int size = socketIn.available(); byte[] buffer = new byte[size]; socketIn.read(buffer); String request = new String(buffer); //打印http请求数据 System.out.println("客户端请求的数据为: " +request); //解析http请求 //获得http请求第一行 String firstLineOfRequest = request.substring(0,request.indexOf("\r\n")); System.out.println("firstLineOfRequest= " +firstLineOfRequest); //解析http请求的第一行 String[] parts = firstLineOfRequest.split(" "); //解析http请求这种的uri String uri = parts[1]; System.out.println("解析http请求这种的uri=" + uri); System.out.println("截图的值为=" + uri.substring(0, 1).toString()); String flag = uri.substring(0, 1).toString(); if(flag.equals("/")){ System.out.println("此请求是从浏览器发起的请求"); uri = uri.substring(1).toString(); } System.out.println("解析http请求这种的uri=" + uri); //如果请求调用servlet,则动态调用servlet的service方法 if(uri.indexOf("HttpTest") != -1){ //获得servlet的名字 String servletName = null; if(uri.indexOf("?") != -1) servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.indexOf("?")); else servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.length()); flag = ""; flag = servletName.substring(0, 1).toString(); if(flag.equals("/")){ servletName = servletName.substring(1).toString(); } //尝试从servlet缓存中回去servlet对象 Servlet servlet = (Servlet)servletCache.get(servletName); //如果servlet缓存在这种不存在servlet对象,则创建他,并把他放在servlet缓存中 if(servlet == null){ servlet = (Servlet)Class.forName("com.lsw.server."+servletName).newInstance(); servlet.init(); servletCache.put(servletName, servlet); } //调用servlet的service()方法 servlet.service(buffer, socket.getOutputStream()); //睡眠1秒等待接收http响应结果 Thread.sleep(1000); socket.close(); return ; } } }
接口源码
package com.lsw.server; import java.io.OutputStream; public interface Servlet { public void init() throws Exception; public void service(byte[] requestBuffer,OutputStream out) throws Exception; }
实现类源码
package com.lsw.server; import java.io.OutputStream; public class HelloServlet implements Servlet { @Override public void init() throws Exception { System.out.println("HelloServlet is inited"); } @Override public void service(byte[] requestBuffer, OutputStream out) throws Exception { String request = new String(requestBuffer); //打印http请求数据 System.out.println("客户端请求的数据为: " +request); //解析http请求 //获得http请求第一行 String firstLineOfRequest = request.substring(0,request.indexOf("\r\n")); System.out.println("firstLineOfRequest= " +firstLineOfRequest); //解析http请求的第一行 String[] parts = firstLineOfRequest.split(" "); //获得http请求中的请求方式 String method = parts[0]; System.out.println("解析http请求方式method=" + method); //解析http请求这种的uri String uri = parts[1]; System.out.println("解析http请求这种的uri=" + uri); System.out.println("截图的值为=" + uri.substring(0, 1).toString()); String flag = uri.substring(0, 1).toString(); if(flag.equals("/")){ System.out.println("此请求是从浏览器发起的请求"); uri = uri.substring(1).toString(); } System.out.println("解析http请求这种的uri=" + uri); //获得请求参数username String username = null; //如果请求方式为get,则请求参数紧跟http请求的第一行的uri的后面 if(method.equalsIgnoreCase("get") && uri.indexOf("username=")!=-1){ //假定uri="servlet/HelloServlet?username=Tom&password=1234" //parameters="username=Tom&password=1234" String parameters = uri.substring(uri.indexOf("?"),uri.length()); //parts={"username=Tom","password=1234"} parts = parameters.split("&"); //parts={"username","Tom"} parts = parts[0].split("="); username = parts[1]; } //如果请求方式为POST,则请求参数位于http请求的正文中 if(method.equalsIgnoreCase("post")){ int locate = request.indexOf("\r\n\r\n"); //获得响应正文 String content = request.substring(locate+4,request.length()); if(content.indexOf("username=")!=-1){ //假定content="username=Tom&password=1234" //parts="username=Tom&password=1234" parts = content.split("&"); parts = parts[0].split("="); username = parts[1]; } } //创建发送响应的http响应 //发送http响应第一行" out.write("HTTP/1.1 200 OK\r\n".getBytes()); //发送http响应头 out.write("Content-Type:text/html\r\n\r\n".getBytes()); //发送http响应正文 out.write("<html><head><title>HelloWorld</title></head></body>".getBytes()); out.write(new String("<h1>Hello:" + username + "</h1></body></head></html>").getBytes()); } }
时间: 2024-10-13 19:03:46