http客户端通过socket类与服务器通信,new Socket("yahoo.com",80);
服务器通过ServerSocket套接字创建时绑定的地址和端口等待客户端请求,new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1")),
当接收到请求后,accept函数才会返回。
//服务端 ServerSocket serverSocket = new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1")); Socket socket = serverSocket.accept(); InputStream input = socket.getInputStream(); OutputStream input = socket.getOutputStream();
Request类
用来表示一个http请求
Request request = new Request(input);
Response
用来表示http响应
Response response = newResponse(output);
Servlet 容器
javax.servlet.Servlet接口声明5个方法
init //初始化一次
service //客户端请求到达后调用,可多次调用,将javax.servlet.ServerRequest和javax.servlet.ServerResponse作为参数传入。
destory
getservletConfig
getServletInfo
public class HttpServer{ public static void main(String[] arg){ while(!loop){ //...省略 ServerSocket serverSocket = new(...) Socket socket = setverSocket.accept(); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); Request request = new Request(input); Response response = new Response(output); ServletProcessor servletProcessor = new ServletProcessor(); servletProcessor.process(request, Response); } } } //servlet类 public class clientServlet implements Servlet{ //init() //destory() //getServletInfo() //getServletConfig() public void service(ServletRequest request, ServletResponse response){ //处理 } } //Request类 public class Request implement ServletRequest{ } //Response类 public class Response implement ServletResponse{ } //ServletProcessor类 public class ServletProcessor{ public void process(Request request, Response response){ URL[] urls = new URL(1); //...url 处理 String servletName = null; //...servletName处理 URLClassLoader loader = new URLClassLoader(urls); Class class = loader.loadClass(servletName); Servlet servlet = class.newInstance(); servlet.service((ServletRequest)request, (ServletResponse)response); } }
连接器
和httpserver类似,过程如下:
public final class Bootstrap{ public static void main(String[] args){ HttpConnector httpConnector = new HttpConnector(); httpConnector.start(); } } public class HttpConnector implements Runnable{ public void run(){ while(!loop){ //...省略 ServerSocket serverSocket = new(...) Socket socket = setverSocket.accept(); HttpProcessor httpProcessor = new HttpProcessor(this); httpProcessor.process(socket); } } public void start(){ Thread thread = new Thread(this); thread.strart(); } } //HTTPProcessor类 public class HttpProcessor{ public void process(Socket socket){ SocketInputStream input = new(SocketInputStream(socket.getInputStream(), 2048); OutputStream output = socket.getOutputStream(); HttpRequest request = new HttpRequest(input); HttpResponse response = new HttpResponse(output); response.setRequest(request); parseRequest(input, output); //处理请求 parseHeaders(input); //解析头部 socket.close(); ServletProcessor servletProcessor = new ServletProcessor(); servletProcessor(request, response); } public void parseRequest(SocketInputStream input , OutputStream output){ //解析请求行 input.readRequestLine(requestLine);//读取j请求行 String method = new String(requestLine.method, 0, request.lineEnd);//获取方法 String url =. ..; String protocal = ...; String queryString = ...; //从uri中获取querystring //读取jsessionid //修正uri //解析header HttpHeader header =new HttpHeader(); input.readHeader(header); //解析cookie //获取参数 //get请求时,通过RequestUtil.parseParameters解析到HashMap //post请求时,通过header的contenttype和contentlength读取,再调用RequestUtil } } //servlet类 public class clientServlet implements Servlet{ //init() //destory() //getServletInfo() //getServletConfig() public void service(ServletRequest request, ServletResponse response){ //处理 } } //ServletProcessor类 public class ServletProcessor{ public void process(Request request, Response response){ URL[] urls = new URL(1); //...url 处理 String servletName = null; //...servletName处理 URLClassLoader loader = new URLClassLoader(urls); Class class = loader.loadClass(servletName); Servlet servlet = class.newInstance(); servlet.service((ServletRequest)request, (ServletResponse)response); } }
标签:
tomcat
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?