这是目前的理解

附上服务端源码

  1. package com.lsw.server;
  2.  
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /*
  8. * 关于服务器,除了httpServer1类,还定义了一个Servlet接口,这个接口有一个init()和一个service()方法
  9. * init()方法为初始化方法,当HTTPServer1类创建了该接口的类的一个实例后,就会立即调用该实例的init()方法
  10. * service()方法:用户响应HTTP的请求,产生具体的HTTP响应结果。
  11. * HTTPServer1服务器在响应HTTP请求时会调用servlet接口的特定类的service()方法
  12. * 所谓web服务器动态执行程序代码。在这个例子中就是指httpServer1在运行时动态加载Servlet接口的实现类,创建他的实例。然后调用他的相关方法。
  13. * HTTPServer1在其实现中利用了java语言的动态加载类的功能
  14. */
  15. //动态执行
  16. public class HTTPServer1 {
  17. //存放selvlet实例的缓存
  18. private static Map servletCache = new HashMap();
  19.  
  20. public static void main(String[] args){
  21. int port;
  22. ServerSocket serverSocket;
  23.  
  24. try{
  25. port = Integer.parseInt(args[0]);
  26. System.out.println("默认端口是: " + port);
  27. }
  28. catch(Exception e){
  29. System.out.println("默认端口8080");
  30. port = 8080;
  31. }
  32.  
  33. try{
  34. //创建监听端口
  35. serverSocket = new ServerSocket(port);
  36. System.out.println("服务器正在监听端口: " + serverSocket.getLocalPort());
  37. while(true){
  38. try{
  39. //等待客户的链接请求
  40. final Socket socket = serverSocket.accept();
  41. System.out.println("建立了一个与客户的新的TCP连接,该客户的地址为: " + socket.getInetAddress()
  42. + " 端口为 : " + socket.getPort());
  43. //响应客户请求
  44. service(socket);
  45. }
  46. catch(Exception e){
  47. e.printStackTrace();
  48. }
  49. }
  50.  
  51. }
  52. catch(Exception e){
  53. e.printStackTrace();
  54. }
  55. }
  56.  
  57. public static void service(Socket socket) throws Exception{
  58. //读取HTTP请求信息
  59. InputStream socketIn = socket.getInputStream(); //获得输入流
  60. //睡眠500毫秒,等待http请求
  61. Thread.sleep(500);
  62. int size = socketIn.available();
  63. byte[] buffer = new byte[size];
  64. socketIn.read(buffer);
  65. String request = new String(buffer);
  66. //打印http请求数据
  67. System.out.println("客户端请求的数据为: " +request);
  68.  
  69. //解析http请求
  70. //获得http请求第一行
  71. String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
  72. System.out.println("firstLineOfRequest= " +firstLineOfRequest);
  73. //解析http请求的第一行
  74. String[] parts = firstLineOfRequest.split(" ");
  75. //解析http请求这种的uri
  76. String uri = parts[1];
  77. System.out.println("解析http请求这种的uri=" + uri);
  78. System.out.println("截图的值为=" + uri.substring(0, 1).toString());
  79. String flag = uri.substring(0, 1).toString();
  80. if(flag.equals("/")){
  81. System.out.println("此请求是从浏览器发起的请求");
  82. uri = uri.substring(1).toString();
  83. }
  84.  
  85. System.out.println("解析http请求这种的uri=" + uri);
  86.  
  87. //如果请求调用servlet,则动态调用servlet的service方法
  88. if(uri.indexOf("HttpTest") != -1){
  89. //获得servlet的名字
  90. String servletName = null;
  91. if(uri.indexOf("?") != -1)
  92. servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.indexOf("?"));
  93. else
  94. servletName = uri.substring(uri.indexOf("HttpTest/")+8, uri.length());
  95. flag = "";
  96. flag = servletName.substring(0, 1).toString();
  97. if(flag.equals("/")){
  98. servletName = servletName.substring(1).toString();
  99. }
  100. //尝试从servlet缓存中回去servlet对象
  101. Servlet servlet = (Servlet)servletCache.get(servletName);
  102. //如果servlet缓存在这种不存在servlet对象,则创建他,并把他放在servlet缓存中
  103. if(servlet == null){
  104. servlet = (Servlet)Class.forName("com.lsw.server."+servletName).newInstance();
  105. servlet.init();
  106. servletCache.put(servletName, servlet);
  107. }
  108.  
  109. //调用servlet的service()方法
  110. servlet.service(buffer, socket.getOutputStream());
  111.  
  112. //睡眠1秒等待接收http响应结果
  113. Thread.sleep(1000);
  114. socket.close();
  115. return ;
  116. }
  117.  
  118. }
  119.  
  120. }

接口源码

  1. package com.lsw.server;
  2.  
  3. import java.io.OutputStream;
  4.  
  5. public interface Servlet {
  6. public void init() throws Exception;
  7. public void service(byte[] requestBuffer,OutputStream out) throws Exception;
  8.  
  9. }

实现类源码

  1. package com.lsw.server;
  2.  
  3. import java.io.OutputStream;
  4.  
  5. public class HelloServlet implements Servlet {
  6.  
  7. @Override
  8. public void init() throws Exception {
  9. System.out.println("HelloServlet is inited");
  10.  
  11. }
  12.  
  13. @Override
  14. public void service(byte[] requestBuffer, OutputStream out)
  15. throws Exception {
  16. String request = new String(requestBuffer);
  17. //打印http请求数据
  18. System.out.println("客户端请求的数据为: " +request);
  19.  
  20. //解析http请求
  21. //获得http请求第一行
  22. String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
  23. System.out.println("firstLineOfRequest= " +firstLineOfRequest);
  24. //解析http请求的第一行
  25. String[] parts = firstLineOfRequest.split(" ");
  26. //获得http请求中的请求方式
  27. String method = parts[0];
  28. System.out.println("解析http请求方式method=" + method);
  29. //解析http请求这种的uri
  30. String uri = parts[1];
  31. System.out.println("解析http请求这种的uri=" + uri);
  32. System.out.println("截图的值为=" + uri.substring(0, 1).toString());
  33. String flag = uri.substring(0, 1).toString();
  34. if(flag.equals("/")){
  35. System.out.println("此请求是从浏览器发起的请求");
  36. uri = uri.substring(1).toString();
  37. }
  38.  
  39. System.out.println("解析http请求这种的uri=" + uri);
  40.  
  41. //获得请求参数username
  42. String username = null;
  43. //如果请求方式为get,则请求参数紧跟http请求的第一行的uri的后面
  44. if(method.equalsIgnoreCase("get") && uri.indexOf("username=")!=-1){
  45. //假定uri="servlet/HelloServlet?username=Tom&password=1234"
  46. //parameters="username=Tom&password=1234"
  47. String parameters = uri.substring(uri.indexOf("?"),uri.length());
  48. //parts={"username=Tom","password=1234"}
  49. parts = parameters.split("&");
  50. //parts={"username","Tom"}
  51. parts = parts[0].split("=");
  52. username = parts[1];
  53. }
  54.  
  55. //如果请求方式为POST,则请求参数位于http请求的正文中
  56. if(method.equalsIgnoreCase("post")){
  57. int locate = request.indexOf("\r\n\r\n");
  58. //获得响应正文
  59. String content = request.substring(locate+4,request.length());
  60. if(content.indexOf("username=")!=-1){
  61. //假定content="username=Tom&password=1234"
  62. //parts="username=Tom&password=1234"
  63. parts = content.split("&");
  64. parts = parts[0].split("=");
  65. username = parts[1];
  66. }
  67. }
  68.  
  69. //创建发送响应的http响应
  70. //发送http响应第一行"
  71. out.write("HTTP/1.1 200 OK\r\n".getBytes());
  72. //发送http响应头
  73. out.write("Content-Type:text/html\r\n\r\n".getBytes());
  74. //发送http响应正文
  75. out.write("<html><head><title>HelloWorld</title></head></body>".getBytes());
  76. out.write(new String("<h1>Hello:" + username + "</h1></body></head></html>").getBytes());
  77. }
  78.  
  79. }

web到service简单原理例子的更多相关文章

  1. Web Service简单入门示例

    Web Service简单入门示例     我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...

  2. .NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  3. Web服务器的工作原理

    Web服务器的工作原理 Web服务器工作原理概述 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了 ...

  4. Spring-Context之一:一个简单的例子

    很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...

  5. 转载:.NET Web开发技术简单整理

    在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...

  6. Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定

    使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定   原文地址:http://www.dotnetjalps.com/2013/05/Simple-da ...

  7. S3 服务(Simple Storage Service简单存储服务) 简介(与hdfs同一级)

    图1  spark 相关 亚马逊云存储之S3(Simple Storage Service简单存储服务) (转 ) S3是Simple Storage Service的缩写,即简单存储服务.亚马逊的名 ...

  8. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击

    跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...

  9. .NET Web开发技术简单整理 转

    .NET Web开发技术简单整理 原文:http://www.cnblogs.com/SanMaoSpace/p/3157293.html 在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何 ...

随机推荐

  1. 算法: 排序: 归并排序(Merge)

    http://www.codeproject.com/Articles/805587/Merge-Sort

  2. asp启用父路径

    开启父路径后可以用../来表示上一层目录,如果网站程序中使用了../,不开启则网站程序里有../就会报错. IIS6启用父路径方法:打开IIS管理器——网站——右键属性——主目录——配置——选项——选 ...

  3. id=%d是什么意思呢?

    $branch=M('Branchs')->where("id=%d",session('branchid'))->find(); %d代表,逗号后面那个user[]的 ...

  4. CSS基础之选择器

    一:CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到,一个样式表时,就会按照. 二:CSS语法 每个CSS有两部分组成:选择器和声明 ...

  5. 【总结】前端框架:react还是vue?

    之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...

  6. 关于UDP数据报引发“异步错误”的疑问

    在UNP卷一第三版的第8章8.9小节中说到:如果udp服务器没有启动,udp客户端在使用sendto发送一行文本后,将会等待一个永远也不会出现的应答从而阻塞在recvfrom调用上. 由于服务器段不存 ...

  7. 利用反射型XSS二次注入绕过CSP form-action限制

    利用反射型XSS二次注入绕过CSP form-action限制 翻译:SecurityToolkit 0x01 简单介绍 CSP(Content-Security-Policy)是为了缓解XSS而存在 ...

  8. jQuery动态给下拉列表添加一个选项(创建DOM对象)

    使用的函数:

  9. Spring4笔记2--Spring的第一个程序

    Spring程序开发: 1. 导入jar包(略) 2. 创建Spring配置文件: Spring 配置文件的文件名可以随意,但 Spring 建议的名称为 applicationContext.xml ...

  10. connect by和strart with子句

    --使用connect by和strart with子句 SELECT [level],column,expression, ... FROM table [WHERE where_clause] [ ...