一.HTTP协议基础

1.定义:HTTP是基于TCP连接的浏览器与服务器通信协议。(即传输层先用TCP三次握手建立连接,进而HTTP通信)

2.连接原理:先进行TCP建立端到端连接,然后发送和接受HTTP报文。

TCP(Socket)是端到端的连接,通过IP地址和端口号用于定位网络上两台主机的具体运行程序。所以HTTP连接会先启动TCP连接来建立与服务器软件的连接,然后发送和接受HTTP报文内容。所以当运行抓包器,打开网页时,会看到一个TCP连接和HTTP连接。在用HTTP 1.0版本时,每打开一个网页就会TCP连接一次。而TCP的每次连接都消耗系统资源(包括CPU和内存)。HTTP1.1版本的TCP连接时持续连接,及请求头默认设置KEEP-ALive=TRUE。这种情况用一份TCP连接传输多次请求。典型就是ajax应用。

3.模拟发送/响应HTTP报文

故:完全可以用Java Socket编写程序模仿客户端浏览器发送http请求。当然,即可实现客户端软件的文件下载功能。

代码如下:模拟发送http请求

  1. Socket s = new Socket(InetAddress.getLocalHost(), 8080);
  2. OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
  3. StringBuffer sb = new StringBuffer();
  4. sb.append("GET /HttpStream/gb2312.jsp HTTP/1.1\r\n");
  5. sb.append("Host: localhost:8088\r\n");
  6. sb.append("Connection: Keep-Alive\r\n");
  7. //注,这是关键的关键,忘了这里让我搞了半个小时。这里一定要一个回车换行,表示消息头完,不然服务器会等待
  8. sb.append("\r\n");
  9. osw.write(sb.toString());
  10. osw.flush();

//模拟读取HTTP响应

  1. InputStream is = s.getInputStream();
  2. String line = null;
  3. int contentLength = 0;//服务器发送回来的消息长度
  4. // 读取所有服务器发送过来的请求参数头部信息
  5. do {
  6. line = readLine(is, 0);
  7. //如果有Content-Length消息头时取出
  8. if (line.startsWith("Content-Length")) {
  9. contentLength = Integer.parseInt(line.split(":")[1].trim());
  10. }
  11. //打印请求部信息
  12. System.out.print(line);
  13. //如果遇到了一个单独的回车换行,则表示请求头结束
  14. } while (!line.equals("\r\n"));
  15. //--输消息的体
  16. System.out.print(readLine(is, contentLength));
  17. //关闭流
  18. is.close();
  19. } catch (UnknownHostException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. //readLine()方法实现未给出,因为我感觉那个读取方法的效率不高。有兴趣可参考原作者代码。

(代码转自http://blog.csdn.net/a9529lty/article/details/7174265,感谢原作者)

二.关于http文件上传和下载

Socket模拟HTTP上传文件代码

  1. File file=new File("c:/雪狼突击队.jpg");
  2. //将文件读成字符串
  3. String picString=readFileAsString(file.toString());
  4. //URLEncode
  5. picString="picdata="+URLEncoder.encode(picString, "UTF-8");
  6. String url="http://localhost:8080/Test/index.jsp?uid=1&username=test&auth=098f6bcd4621d373cade4e832627b4f6";
  7. Socket socket =new Socket(InetAddress.getByName(url),80);
  8. DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
  9. String message=""
  10. +"POST "+url+" HTTP/1.1 \r\n "
  11. +"Host: test.lingye.com \r\n "+"Accept: */* \r\n "
  12. +"Cache-Control:no-cache \r\n" +"User-Agent: MSIE6.0; \r\n "
  13. +"Content-Type: application/x-www-form-urlencoded \r\n "
  14. +"Content-Length: "+picString.length()+" \r\n "
  15. +"Connection: Close \r\n\r\n"//报头以两个\n作为结束标志
  16. +picString+"\r\n ";//post数据
  17. byte buffer[]=message.getBytes();
  18. dos.write(buffer);
  19. dos.flush();
  20. dos.close();
  21. //以上只进行了发送操作
  22. socket.close();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. 服务器端servlet
  1. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. String picdata =request.getParameter("picdata");
  3. //注意这里的picData是图片对应的Encode编码方式,同一个编码和同一个解码方式
  4. BASE64Decoder base64=new BASE64Decoder();
  5. //64位解码
  6. byte[] buffer=base64.decodeBuffer(picdata);
  7. //写进文件
  8. FileOutputStream fos=new FileOutputStream("c:/雪狼突击队1.jpg");
  9. fos.write(buffer);
  10. fos.flush();
  11. fos.close();
  12. fos=null;
  13. }

(代码转自http://blog.sina.com.cn/s/blog_5da93c8f0100vj3v.html,感谢作者)

以上可以看出,Java语言可以编写浏览器,当然浏览器功能很复杂。浏览器对http响应的html代码进行解析,就形成了我们看到的网页。

注意看socket模拟http请求和响应的方法,可以看出读取输入流/输出流都是在一个socket连接中获得的,即每次TCP连接(3次握手后),都会有一个对应的输入和输出。利用该输入输出流就可以发送和接受数据。

4.协议内容详解

参考http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html,协议具体内容讲解很详细

5.关于http1.0和http1.1的持续连接与非持续连接

HTTP/1.0和HTTP/1.1都有非持续连接(non-persistent connection)和持续连接(persistent connection)功能。非持续连接是指启动一次TCP连接服务机就向客户机传送一个对象,而持续连接是指服务机可在相同的TCP连接上向客户机发送多个对象。HTTP/1.0的默认设置是非持续连接,而HTTP/1.1的默认设置是持续连接。

在使用HTTP/1.0的情况下,如果打开一个包含一个HTML文件和10个内联图象对象的网页时,HTTP就要建立11次TCP连接才能把文件从服务机传送到客户机。而使用HTTP/1.1的情况下,如果打开同样的文件时,HTTP建立一次TCP连接就可把文件从服务机传送到客户机。使用一次TCP连接传送一个对象的效率比较低,这体现在下列几个方面:

(1) 每次TCP连接必需要建立和断开。客户机和服务机建立一次连接需要执行三向沟通连接法(three-way handshake),服务机在对象递送之后要断开TCP连接。在建立和断开连接时要占用CPU的资源。如果使用一次连接代替11次连接的话,占用客户机和服务机的CPU时间可大大减少。

(2) 对每次连接,客户机和服务机都必须分配发送和接收缓存。这就意味着要影响客户机和服务机的存储器资源,这同样要占用CPU的时间。

(3) 对由大数量对象组成的文件,TCP的低速启动算法(slow start-up algorithm)会限制服务机向客户机传送对象的速度。使用HTTP/1.1之后,大多数对象都可以尽最大的速率传送。

由于HTTP/1.1允许持续连接,文件中的所有对象都可在相同的TCP连接上传送。HTTP/1.1也允许在客户机接收到服务机的消息响应之前发送多个消息请求,这叫做流水线式请求(pipelined request)。

(此段转自http://blog.chinaunix.net/uid-9681606-id-1998549.html,感谢作者贡献)

6.

请问为什么get方式的请求消息中没有实体内容呢?

使用Get方式的请求消息中不能包含实体内容,只有post方式的请求消息中才可以包含实体内容
,我有点疑问,为什么get方式的请求消息中没有实体内容,请求消息中的实体内容值的什么啊,参数不是实体内容吗?
 
回答:
这位朋友可能还不太了解http协议
一个完整的请求消息包含:一个请求行 若干消息头,以及实体内容;
其中的一些消息头和实体内容都是可选的!!!!
而在get与post方式中
如一个form表单吧
由于get方式是不包含实体内容的,实体内容就(也就是表单的数据)以参数的形式在url地址后面出现
post是包含实体内容的,它把表单数据放入实体内容里面,以'实体内容'的形式传输
get方式的数据量是有限制的 一般在1kb以下,而post方式则要大的多了!
由此你也可有看出 参数和实体内容的区别了吧;;;

java web基础2HTTP协议知识点总结的更多相关文章

  1. java web基础第一次作业

    JAVA WEB基础 一.B/S架构 1.B/S架构简介: B是英文单词“Browser”的首字母,即浏览器的意思:S是英文单词“Server”的首字母,即服务器的意思.B/S就是“Browser/S ...

  2. Java Web基础 --- Servlet 综述(理论篇)

    摘要: Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.本文首先从请求/响应架构应用的大背景谈起 Servlet 的由来,明确 Ser ...

  3. java web基础环境搭建

    java web基础环境包括:(1)servlet容器也即tomcat(2)jre即java程序运行环境 环境变量配置:分别下载jdk和tomcat安装包. jdk环境变量配置: 第一步:系统环境变量 ...

  4. java web基础 --- URL重定向Filter

    java web基础 --- URL重定向Filter httpRequest.getRequestDispatcher("/helloWorld").forward(httpRe ...

  5. java web基础

    WEB基础 C/S:即服务器-客服机(Client-Server)结构.C/S结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务.客户通过局域网与服务器相连,接受用户的请求,并 ...

  6. Java Web基础入门

    前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...

  7. java web基础之mvc模式设计(一)--使用httpservlet实现mvc分层设计,DAO层使用的是dbutils实现与数据库的链接

    一:1.最终的实现效果图: 2.案例的目录结构: 3.案例中使用到的jar包: 二:案例的链接数据库的层次结构关系:数据库是:mysql ,数据库名字:dsm,表格名字:customers 数据库表格 ...

  8. Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  9. 【转】Java学习---Java Web基础面试题整理

    [原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...

随机推荐

  1. 一、HTML和CSS基础--网页布局--实践--固定层效果

    absolute和fixed的相同点: 第一,完全脱离标准文档流 第二,未设置偏移量时,都定位在父元素的左上角 absolute和fixed的不同点: 第一.当设置偏移量时,偏移参照基准不同 abso ...

  2. 怎么判定一个mac地址是multicast还是unicast.

    MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置.MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique ide ...

  3. BZOJ 3437: 小P的牧场 斜率优化DP

    3437: 小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场 ...

  4. android 定时器的实现

    在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java.util.Timer. 在onStart()创创建Time ...

  5. Wp8—LongListSelector控件使用

    其实从去年后半年起,自己就开始学习windows phone 8 的开发,主要是自己感兴趣同时我也很看好这个系统(现在还是感觉自己认识的有点晚了).工作日的话基本很忙,所以当时想到然的认为用晚上时间可 ...

  6. Oracle 使用小计(2)

    1.时间转换 1.1 字符串转时间 今天需要写SQL语句更新数据库的时间,按照SQL Server的习惯写成 UPDATE TABLE A ’ WHERE ORDER_ID = ‘A12345678’ ...

  7. MVC WEB安全——XSS攻击防御

    XSS(跨站脚本攻击) 描述: 原理:攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到攻击用户的特殊目的. 类别: 1)被动注入(Passive Inj ...

  8. 字符串全排列(permutation)

    Reference: http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html 问题:给定字符串S,生成该字符串的全排列. 方法1:依次从 ...

  9. 【UR #4】元旦三侠的游戏(博弈论+记忆化)

    http://uoj.ac/contest/6/problem/51 题意:给m($m \le 10^5$)个询问,每次给出$a, b(a^b \le n, n \le 10^9)$,对于每一组$a, ...

  10. 【wikioi】1116 四色问题

    题目链接 算法:DFS 刚开始卡了一下,但后面想了想,于是 放上代码: #include <iostream> using namespace std; bool map[9][9]; i ...