文档章节

http协议之get请求原理(socket请求web内容)

pseudo
 pseudo
发布于 2013/05/05 23:32
字数 404
阅读 1074
收藏 13

http是处于tcp/ip四层网络模型的应用层(最上层),如下图

因为它是建立在tcp协议之上的,所以它的底层实现是socket.(笔者猜测HttpUrlConnection与开源工具httpClient都是建立在socket之上的,但没有进行证实,有时间的朋友可以看下源码)

http 请求格式如下


Method URI Protocol/Version\r\n
Request headers
\r\n
Entity body

Method 是请求方法(get, post, delete, put, head, options, trace), URI是要请求的资源定位符,Protocol/Version是请求协议及版本(这里是HTTP/1.1).各部分之间由CRLF(即"\r\n")分开.(注意请求头的每个request header也是以\r\n结束的,但headers与entity body 之间还有一个\r\n,具体参见下面实例)

http 响应格式如下


Protocol/Version Status-code Description\r\n
Response headers
\r\n
Entity body
一个典型的http请求如下



这是在笔者的电脑上用firefox请求本地的tomcat所截取的数据包。返回的数据如下

好了,下面我们可以编程模拟get 请求了,代码如下:


public class Test {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s = new Socket("127.0.0.1", 8080);
		
		String method = "GET /index.html HTTP/1.1\r\n";
		String host = "Host: localhost:8080\r\n";
		OutputStream os = s.getOutputStream();
		os.write(method.getBytes());
		os.write(host.getBytes());
		
		//注意这个CRLF,否则请求格式不正确,不能发起连接
		os.write("\r\n".getBytes());
		os.flush();
		InputStream is = s.getInputStream();
		byte[] buffer = new byte[216];
		int count=0;
		StringBuilder str = new StringBuilder();
		while((count=is.read(buffer))>0) {
			str.append(new String(buffer,0,count));
		}
		s.close();
		System.out.println(str.toString());
	}
}
下面是截取的数据包:


返回数据包与上相同,不再赘述。

© 著作权归作者所有

共有 人打赏支持
pseudo

pseudo

粉丝 77
博文 37
码字总数 35469
作品 3
朝阳
程序员
Golang Web学习(13)—— 搭建简单的Web服务器

本文为转载,原文:Golang Web学习(13)—— 搭建简单的Web服务器 Golang 1、Web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要 浏览的内容。...

ChainZhang
01/14
0
0
iOS Socket编程

一、网络各个协议:TCP/IP、SOCKET、HTTP等 网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 其中物理层、数据链路层和网络层通常被称作媒体层,是网络...

hanbing94
2016/03/14
56
0
http、TCP/IP协议与socket之间的区别

网络由下往上分为 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- HTTP协议 1、TCP/IP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以...

huojiao2006
2017/01/05
0
0
TCP和Http的区别!我都搞懂了,你就别迷糊了!

相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。 1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可...

yzbty23
2015/12/22
1K
2
关于iOS socket(套接字)

socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远...

天机
2016/06/03
172
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
27分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
30分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
34分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
44分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部