• HTTP1.0工作原理


    1.HTTP工作原理

    HTTP响应报文与工作原理详解》讲的比较详细了。

    2.示例

    (1)server端程序如下:

     1 package org.yeyouluo.demo.jsp;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.IOException;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStreamWriter;
     8 import java.io.PrintWriter;
     9 import java.net.ServerSocket;
    10 import java.net.Socket;
    11 import java.util.concurrent.ExecutorService;
    12 import java.util.concurrent.Executors;
    13 
    14 /**
    15  * 实现HTTP 1.0的服务器,对于所有的HTTP请求,会把HTTP请求头响应回去。
    16  * @author yeyouluo
    17  *
    18  */
    19 public class MyHTTPServer {
    20 
    21     public static void main(String[] args) throws IOException {
    22         int port = 80;
    23         ServerSocket serverSocket = new ServerSocket(port); 
    24         System.out.println("启动服务,绑定端口: " + port);
    25         
    26         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(30);  //5.线程池
    27         
    28         //6.这个循环不停监听socket连接,使用SocketHandler处理连入的socket,而这个处理是放在线程池中的。
    29         while(true){ 
    30             Socket clientSocket = serverSocket.accept();
    31             System.out.println("新的连接"+clientSocket.getInetAddress() + ":" + clientSocket.getPort());
    32             try{
    33                 fixedThreadPool.execute(new SocketHandler(clientSocket));
    34             }catch(Exception e){
    35                 e.printStackTrace();
    36             }
    37         }
    38     }
    39 
    40 }
    41 
    42 class SocketHandler implements Runnable{
    43     static final String CRLF = "
    ";  //1.换行符
    44     private Socket clientSocket;
    45     
    46     public SocketHandler(Socket clientSocket) {
    47         super();
    48         this.clientSocket = clientSocket;
    49     }
    50     
    51     public void handleSocket(Socket clientSocket) throws IOException{
    52         BufferedReader in = new BufferedReader(
    53                             new InputStreamReader(clientSocket.getInputStream())
    54                             );
    55         
    56         PrintWriter out = new PrintWriter(
    57                             new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))
    58                             ,true);
    59         
    60         String requestHeader = "";
    61         String s;
    62         while( (s = in.readLine()) != null ){
    63             s +=  CRLF;  //2.很重要,默认情况下in.readLine的结果中'
    '被去掉了
    64             requestHeader += s;
    65             if( CRLF.equals(s) ){  //如果读取的一行数据只有换行符,说明请求头已经结束了
    66                 break;
    67             }
    68         }
    69         
    70          System.out.println("客户端请求头:
    " + requestHeader);
    71          
    72          String responseBody = "客户端的请求头是:
    "+requestHeader;
    73          String responseHeader = "HTTP/1.0 200 OK
    " +
    74                     "Content-Type: text/plain; charset=UTF-8
    " +
    75                     "Content-Length: "+responseBody.getBytes().length+"
    " +
    76                     "
    ";
    77          System.out.println("响应头:
    " + responseHeader);
    78          
    79          out.write(responseHeader);
    80          out.write(responseBody);
    81          out.flush();
    82          
    83          out.close();
    84          in.close();
    85          clientSocket.close();
    86     }
    87     
    88     @Override
    89     public void run() {
    90         try {
    91             handleSocket(clientSocket);
    92         } catch (IOException e) {
    93             // TODO Auto-generated catch block
    94             e.printStackTrace();
    95         }
    96     }
    97     
    98 }
    server端

    启动server端。

    (2)client端直接通过浏览器或curl工具发送http请求即可。比如在浏览器中输入http://127.0.0.1  。

    (3)server端控制台打印如下:

    3.参考

    http://wiki.jikexueyuan.com/project/java-web/00-02.html

  • 相关阅读:
    优化慢执行或慢查询的方法
    Top K问题的两种解决思路
    优先队列实现 大小根堆 解决top k 问题
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    二叉树基础之按层打印
    按层打印二叉树--每行打印一层
    给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
    缓存与数据库一致性保证
    一致性哈希算法原理
    Linux复制指定目录下的文件夹结构
  • 原文地址:https://www.cnblogs.com/helloIT/p/6661267.html
Copyright © 2020-2023  润新知