一.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. WebService之CXF框架

    本文主要包括以下内容 ant工具的使用 利用cxf实现webservice cxf与spring整合 ajax访问webservice ant 工具 1.为什么要用到ant这个工具呢? Ant做为一种 ...

  2. hadoop之快照

    在hadoop第前几个版本中是没有快照功能的,2.x中是有这个特性的 Hadoop 2.x HDFS新特性   HDFS快照 HDFS快照     在2.x终于实现了快照     设置一个目录为可快照 ...

  3. RedHat6.2 下RRDTool安装方法

    在安装ganglia的时候,需要安装ttdtol, 否则是不运去安装的.查可很多,这个可以. 我的环境: [hadoop@host8 ~]$ lsb_release -aLSB Version: :c ...

  4. 【ASP.NET MVC】个人复习整理

    1.为 Action 标注 Attribute 限制访问 public class HomeController : Controller { [HttpPost] public ActionResu ...

  5. .NET生成word文档服务器配置常见问题

    注意:安装office2003的时候一定要选择 "完全安装" 而不是 "典型安装" 错误:System.Runtime.InteropServices.COME ...

  6. 会员制实现C2B定制有机农产品,被中粮我买投资的良食网这样卖有机生鲜

    前几天,中粮我买网战略投资了位于深圳的有机生鲜自营平台良食网,宣布双方将会在供应链上展开合作.然而良食网对大家来说还是比较陌生的,为此36氪专访了良食网的创始人唐忠. 良食网成立于2011年,是一家以 ...

  7. 完美搞定《DOCKER IN ACTION》第二章示例

    起来!!!命令如下: 建立第一个web docker docker run --detach --name web nginx:latest 建立第二个web_test docker docker r ...

  8. Theano在CentOS 6 下的安装及GPU加速

    系统版本:Red Hat 4.4.6-4 一. 未联网情况下,选择本地安装. 首先安装theano的依赖库,包括:scipy-0.16.1numpy-1.9.2nose-1.3.7 (optional ...

  9. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)转载自码农网

    7. 安装 PHP PHP 是用于 web 基础服务的服务器端脚本语言.它也经常被用作通用编程语言.在最小化安装的 CentOS 中安装 PHP: # yum install php 安装完 php ...

  10. Dialog对话框

    1.显示内容 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(&q ...