http协议之get请求原理(socket请求web内容)
博客专区 > pseudo 的博客 > 博客详情
http协议之get请求原理(socket请求web内容)
pseudo 发表于5年前
http协议之get请求原理(socket请求web内容)
  • 发表于 5年前
  • 阅读 1070
  • 收藏 13
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

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
粉丝 74
博文 37
码字总数 35469
作品 3
×
pseudo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: