HTTP协议是网络应用层协议,建立在TCP/IP协议基础上。
HTTP协议基于客户/服务器模式,客户端主动发出HTTP请求,服务器接收HTTP请求,返回HTTP响应结果。HTTP协议对HTTP请求,以及响应的格式作了明确的规定。
HTTP客户程序和HTTP服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。用VC编写的HTTP客户程序能否与用java编写的HTTP服务器顺利通信呢?答案是肯定的。HTTP协议严格规定了HTTP请求和HTTP响应的数据格式,只要HTTP服务器与客户程序都遵守HTTP协议。
-------
HTTP请求格式:
HTTP协议规定,HTTP请求由3部分,分别是
1、请求方式、URI、HTTP协议的版本
2、请求头(Rquest Header)
3、请求正文(Reuqest Content)
如:
POST/hello.htm HTTP/1.1
Accept:image/gif,image/jpeg,*/*
Referer:http://locallost/login.htm
Accept-Language:en,zh-cn;q=0.5
Content-Type:application/x-www-form-rulencoded
Accept-Encoding:gzip,deflate
User-Agent:Mozila/4.0(compatible;MSIE6.0;Windows NT 5.0)
Host:localhost
Content-Length:43
Connection:Keep-Alive
Cache-Control:no-cache
空行
username=weiqin&password=123&submit=submit
-----
1、请求方式、URI、HTTP协议的版本
POST /hello.html HTTP/1.1
HEAD:客户程序和服务器之间交流一些颞部数据,服务器不会返回具体的文档。当使用GET和POST方法时,服务器最后都将特定的文档返回给客户程序。
2、请求头
请求头包含许多有关客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器的类型、所用的语言、请求正文,以及请求正文的长度等。
3、请求正文
HTTP协议规定,请求头和请求正文之间必须以空行分隔(z只有CRLF符号的行),
这个空行非常重要,它表示请求头已经结束,接下来时请求正文。请求正文可以包含客户以POST方式提交的表单数据:username=weiqin&password=123&submit=submit
注:CRLF是指回车符和行结束符"\r\n"

/**
* 使用Socket创建一个Htpp客户端
*
*/
public class SimpleHttpClient { public void sendReuqest(){
Socket socket = null;
try {
//连接HTTP服务器
socket = new Socket("127.0.0.1", 8088);
//拼接HTTP请求协议规格
StringBuffer sb = new StringBuffer(
"GET"+"/index.jsp"+"HTTP/1.1\r\n");
sb.append("Host:127.0.0.1\r\n");
sb.append("Accept:*/*\r\n");
sb.append("Accept-Language:zh-cn\r\n");
sb.append("Accept-Encoding:gzip,deflate\r\n");
sb.append("User-Agent:Mozila/4.0("
+ "compatible;MSIE 6.0;Windows NT 5.0)\r\n");
sb.append("Contenction:Keep-Alive\r\n\r\n");
//发送HTTP请求
OutputStream out = socket.getOutputStream();
out.write(sb.toString().getBytes());
socket.shutdownInput(); //接收HTTP响应结果
InputStream in = socket.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len =-1;
while((len = in.read(buff)) != -1){
buffer.write(buff, 0, len);
}
System.out.println(new String(buffer.toByteArray()));
} catch (Exception e) {
// TODO: handle exception
} }
}

-------------
HTTP响应格式
与HTTP请求相似,HTTP响应也由3部分构成,分别是:
1、HTTP协议的版本、状态代码、描述
2、响应头
3、响应正文
如:
HTTP/1.1 200 OK
Server:nio/1.1
Content-Type:text/html;charset=GBK
Content-length:102
<html>
<head>
<title>helloapp</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
------
1、HTTP协议的版本、状态代码、描述
状态码:是一个3位整数,以1/2/3/4或5开头
1xx:信息提示,表示临时响应。
2xx:响应成功,表名服务器成功地接收了客户端请求
3xx:重定向
4xx:客户端错误,
5xx:服务器错误
2、响应头
响应头也和请求头一样包含许多有用的信息。例如:服务器类型、正文类型、正文长度等:
Server:nio/1.1
Content-Type:text/html;charset=GBK
Content-length:102
3、响应正文:
常见的是HTML网页
注:HTTP请求头与请求正文之间必须用空行分隔,同样,HTTP响应头与响应正文之间也必须空行分隔。

HTTP协议规定,客户端的编写的更多相关文章

  1. 基于TCP协议的客户端

    基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...

  2. python之模块ftplib(FTP协议的客户端)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...

  3. 它是对 ACME(automated certificate management environment) 协议的实现,只要实现了 ACME 协议的客户端都可以跟它交互。

    它是对 ACME(automated certificate management environment) 协议的实现,只要实现了 ACME 协议的客户端都可以跟它交互. https://mp.we ...

  4. yarn/mapreduce工作机制及mapreduce客户端代码编写

    首先需要知道的就是在老版本的hadoop中是没有yarn的,mapreduce既负责资源分配又负责业务逻辑处理.为了解耦,把资源分配这块抽了出来,形成了yarn,这样不仅mapreudce可以用yar ...

  5. 一文彻底理解Redis序列化协议,你也可以编写Redis客户端

    前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析 ...

  6. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  7. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  8. Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  9. HTTPS-HSTS协议(强制客户端使用HTTPS与服务器创建连接)

    HSTS(HTTP Strict Transport Security)国际互联网工程组织IETE正在推行一种新的Web安全协议 HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接. ...

随机推荐

  1. SQL配置的坑

    我要被自己蠢哭了,新做了一台电脑装SQL sever为了存数据,配置完,突然间发现MSSQLSEVER 不能重新启动,相当于之前的配置,还IP都白弄了.我找原因找了3个小时,后来发现是手欠启动的不该启 ...

  2. 补码的来源以及为什么byte的最小值是-128

    1.        有符号数和无符号数 我们的实数分为正数和负数和0三部分 Byte数据类型一共有8位,如果是无符号数,最大可以表示的数为11111111 = 256 -1 = 255 无符号数代指不 ...

  3. int类型129转byte类型得到-127的解释

    package com.yygc.zhen.codeing_base; /** * @author zhen * @Date 2019/2/22 10:03 * 类型转换 */ public clas ...

  4. Java容器解析系列(4) ArrayList Vector Stack 详解

    ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...

  5. Java容器解析系列(5) AbstractSequentialList LinkedList 详解

    AbstractSequentialList为顺序访问的list提供了一个骨架实现,使实现顺序访问的list变得简单; 我们来看源码: /** AbstractSequentialList 继承自 A ...

  6. chmod语法

    chmod命令详细用法   指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 :  ...

  7. Js/对数组的认识。

    1.是对数组的声明:   var auditTaskIds = []; 我一般的写法.   var auditTaskIds1 = [];  2.向数组中添加元素:   auditTaskIds.pu ...

  8. CART-GBRT-GBDT

    CART:分类回归树 分类树和回归树的区别:分裂节点时使用的节点非纯度量(最小化准则.特征选择)不一样,修剪树的准则不一样 回归树: 节点非纯度量:平方误差和 区域估计值:均值(在给定的划分下,均值带 ...

  9. 19/03/30Python笔记

    一.三元运算 a = 1 if (条件) else a = 2 #如果条件成立,a = 1,否则a = 2 二.文件的处理 1.读取 f = open("user.txt",&qu ...

  10. PythonStudy——字符串扩展方法 String extension method

    ')) ')) print('***000123123***'.lstrip('*')) print('***000123123***'.rstrip('*')) print('华丽分割线'.cent ...