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. 学号 20175223 《Java程序设计》第2周学习总结

    学号 20175223 <Java程序设计>第2周学习总结 教材学习内容总结 第二章要点: 要点1:标识符与关键字 要点2:基本数据类型:逻辑类型boolean,整数类型int|byte| ...

  2. bat中errorlevel与%errorlevel%的区别

    bat中errorlevel与%errorlevel%的区别? 他们都是判断上个命令的返回值.当使用if errorlevel 值 cmmand 句式时,它的含义是:如果返回的错误码值大于或等于值 的 ...

  3. 吴恩达机器学习-octave笔记

    隐藏前缀提示符:PS1('>>') 不显示打印内容:;结尾 字符串:a=’hi’ 屏幕输出:disp(sprint(‘2 decimals:%0.2f’,a)) 生成集合(矩阵):V=1: ...

  4. 关于idea的debug

    idea的debug真的是超级好用哎.分享几个今天学会的新方式: 1.右键会发现此选项 ,点击出现 在输入框中输入,可以通过某些公式单独计算. 2.点击属性值,右键点击set values 会出现一个 ...

  5. tomcat 启动脚本走过的坑

    最近由于 程序写的问题 tomcat经常需要重启,所以就让我写给监控tomcat并启动的脚本 例: 看着一起正常 然后就写到 crontab 计划任务里了 后来发现不管用, 找了好多文档 就是找不到问 ...

  6. php之强制回调类型callable

    <?php function demo(callable $fn) { $fn(); } function callback() { echo __FUNCTION__,'<br/> ...

  7. Cortex-M3的一些概念

    [工作模式] 线程模式(Thread mode):处理器复位或异常退出时为此模式.此模式下的代码可以是特权代码也可以是用户代码,通过CONTROL[0]控制.处理模式(Handler mode):出现 ...

  8. Python全栈之路----Python2与Python3

    金角大王Alex  python 之路,致那些年,我们依然没搞明白的编码 python2与python3的区别 py2 str = bytes 为什么有bytes? 是因为要表示图片.视频等二进制格式 ...

  9. 测试那些事儿—postman进阶使用与实战

    1.postman进阶使用 1)环境与变量: 备注:全局 和 局部 变量不会影响到变量的调用,区别在于局部变量对于非当前环境不能使用而已. a.当测试存在多个环境时,可以先设置一个环境,然后在此环境下 ...

  10. Qt5 中文乱码问题

    在做gui界面时,使用QTdesigner设计时,控件的名称等输入中文没有问题.为了更加灵活点,直接使用代码进行布局就很有必要了.这样就会出现中文的乱码.为了解决乱码,查看资料说时修改文件保存的编码, ...