Http协议以及模拟http请求发送数据
1 为什么要使用http协议
假设我现在有两个客户端浏览器,一个是google,一个是IE浏览器;我现在有两个服务器,一个是tomcat,一个是JBoss;在最初的情况下是:如果google要往tomcat上发送数据,就一定要在消息的前面加上google;比如google:helloWorld!此时tomcat上需要接受数据,假设tomcat接受 数据的数据格式是:apache:helloWorld!;此时问题出现了,我们该怎么识别数据,同样的IE浏览器要往tomcat发送相同的数据,格式是IE:helloWorld!。此时该怎么办?

而且问题不单单这么简单;如果google浏览器和IE浏览器向JBoss服务器发送数据,JBoss如果接收数据的格式是redhat:helloWorld!.此时情况就要复杂的多;这样看来除非自家的服务器识别自家的浏览器;我们不能要求用户使用指定的浏览器访问指定的网页;实际中,我们确实可以使用任何浏览器访问任何网页。这就是因为有了http协议。http默认是无状态的,而且端口为80端口;只有客户端和服务端都遵循这个协议,数据的发送和接受就可以统一了,在任何服务器或者浏览器上都可以识别;

那么Http协议究竟是怎么对请求数据的格式和响应数据的格式做规定了;请看如下的叙述:
·1 HTTP协议请求数据的格式
比如我访问http://www.importnew.com/27777.html这个网页,此时我们可以查看网络;F12查看:

1)请求方式:包括资源的URI(统一资源定位符,这里可以理解为除去域名的资源地址)和请求方式(GET/POST。。。)

2)请求头

3)请求正文
比如GET请求表单提交时username=xxx&pwd=xxx;在这里需要注意的是请求头和请求正文之间存在一行空格;表示请求头结束;
2 http的版本
HTTP1.0
比如我们访问一个网页,存在8个资源,每一个资源都会建立一次连接,发送一次数据,响应一次数据,关闭一次连接,总共是8次连接,8次数据发送,8次数据的响应,8次连接的关闭;建立连接和关闭连接很消耗性能;
HTTP1.1
比如我们访问一个网页,存在8个资源,只会建立一次连接,每访问一个资源发送一次数据,响应一次数据;最终只会关闭一次连接,总共是1次连接,8次数据发送,8次数据的响应,1次连接的关闭;改善了性能。
3 模拟httpClient发送数据
在这里我访问我自己的项目,部署在tomcat下;地址是http://localhost:8080/leoshop/AboutBlank.jsp
以下的代码是我模拟httpClient的GET请求;响应内容是jsp页面的源代码:
package com.asiaInfo.caozg.ch_01; import java.net.*;
import java.io.*; public class HttpClient {
String host = "localhost";
int port = 8080;
Socket socket; public void createSocket() throws Exception {
socket = new Socket(host, port);
} public void communicate() throws Exception {
StringBuffer sb = new StringBuffer("GET " + "/leoshop/AboutBlank.jsp" + " HTTP/1.1\r\n");
sb.append("Host: localhost:8080\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: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 10.0)\r\n");
sb.append("Connection: Keep-Alive\r\n\r\n"); //发出HTTP请求
OutputStream socketOut = socket.getOutputStream();
socketOut.write(sb.toString().getBytes());
socket.shutdownOutput(); //关闭输出流 InputStream socketIn = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(socketIn, "UTF-8"));
String data;
while ((data = br.readLine()) != null) {
System.out.println(data);
}
socket.close();
} public static void main(String args[]) throws Exception {
HttpClient client = new HttpClient();
client.createSocket();
client.communicate();
}
}
响应内容:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=8C02608AB1DBB0ED3608D9229C663002; Path=/leoshop; HttpOnly
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 13 Jan 2018 17:32:17 GMT <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
......
<head>
</head>
</body>
...... </body>
</html>
Http协议以及模拟http请求发送数据的更多相关文章
- php curl模拟post请求提交数据样例总结
在php中要模拟post请求数据提交我们会使用到curl函数,以下我来给大家举几个curl模拟post请求提交数据样例有须要的朋友可參考參考.注意:curl函数在php中默认是不被支持的,假设须要使用 ...
- php curl模拟post请求提交数据例子总结
php curl模拟post请求提交数据例子总结 [导读] 在php中要模拟post请求数据提交我们会使用到curl函数,下面我来给大家举几个curl模拟post请求提交数据例子有需要的朋友可参考参考 ...
- php模拟POST请求提交数据
php模拟POST请求提交数据 1.基于fsockopen function phppost00($jsonString){ $URL='https://www.jy.com/phppostok.ph ...
- jmeter ---模拟http请求/发送gzip数据
jmeter中get请求gzip数据的方法: 在jmeter线程组中添加“http信息头管理器”,并添加名称:Accept-Encoding值: gzip,deflate注:HTTP信息头Accept ...
- java模拟post请求发送json
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
- Java模拟POST请求发送二进制数据
在进行程序之间数据通信时我们有时候就需要自定义二进制格式,然后通过HTTP进行二进制数据交互.交互的示例代码如下: public static void main(String[] args) { S ...
- java模拟post请求发送json数据
import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; ...
- nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
浏览器给服务器传递参数,最常用的是地址栏传参(get),以及表单提交(post) 先说get传参,就是在url后跟上?key=value&key2=value2...... 但是按照前几篇的h ...
- php curl模拟post请求提交数据
最近在做校园图书馆图书信息的采集程序,既然是图书馆图书的采集,肯定有提交搜索的页面,无非是post提交,让我想到了curl模拟提交,首先通过firebug进行抓包查询下post提交后的格式如下: tx ...
随机推荐
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- static_class
<?php class MyObject { public static $myStaticVar = 0; function myMethod() { self::$myStaticVar + ...
- PAT 天梯赛 L2-003. 月饼 【贪心】
题目链接 https://www.patest.cn/contests/gplt/L2-003 思路 用贪心思路 最后注意一下 总售价有可能是浮点数 AC代码 #include <cstdio& ...
- running a background task over ssh
原文: Why does running a background task over ssh fail if a pseudo-tty is allocated? 问题: I've recently ...
- POJ 3349 Snowflake Snow Snowflakes (哈希表)
题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...
- JS中的forEach、$.each、map方法推荐
下面小编就为大家带来一篇JS中的forEach.$.each.map方法推荐.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 orEach是ECMA5中Array新方法中最 ...
- pyglet--EventLoop对象(主事件循环,用于从系统消息队列中取出消息,并派发给各个窗口)
一.识别系统消息,并派出该消息 EventLoop(应用程序的事件循环),用于循环的从系统消息队列中获取系统消息(包含消息的各种参数:如鼠标位置,事件类型,鼠标左右键,哪个键盘键等),然后派发相应的事 ...
- Linux下几种RTP协议实现的比较和JRTPLIB编程讲解
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议. IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...
- ACM学习历程—HDU5478 Can you find it(数论)(2015上海网赛11题)
Problem Description Given a prime number C(1≤C≤2×105), and three integers k1, b1, k2 (1≤k1,k2,b1≤109 ...
- bzoj 1398: 寻找主人 AC自动机+最小表示法
题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...