HTTP工作原理,为什么用程序的方式和用浏览器的方式,结果不一样
初次详细地学习HTTP服务的原理,于是想通过java程序向百度发送一个HTTP请求,不知道哪出问题了,打印在控制台的内容和通过浏览器访问百度的返回的文本居然不一致,而且写得程序并没有很快停止,还一直处在运行的时间
请大家多多指正我这个菜鸟,可能是我程序写得不对,也可能是HTTP并没有理解透
程序源码
public class Http {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("220.181.111.85", 80);
OutputStream ops=s.getOutputStream();
Writer osw=new OutputStreamWriter(ops);
PrintWriter pw=new PrintWriter(osw);
pw.println("GET / HTTP/1.1");
pw.println("Host:220.181.111.85");
pw.println("Content-Type:text/html");
pw.println();//空行
pw.flush();
InputStream ips=s.getInputStream();
Reader osr=new InputStreamReader(ips);
BufferedReader br=new BufferedReader(osr);
String str="";
while((str=br.readLine())!=null){
System.out.println(str);
}
System.out.println("shushu");
br.close();
pw.close();
s.close();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
对于程序没有立刻停止的问题,有两种简单的改法:
1. pw.println("GET / HTTP/1.0"); //这里改为1.0
2. pw.println("Connection:close"); //设置Connection属性
如果是复杂的改法就读响应头,判断Content-Length的值。更麻烦点的还要处理chunked传输问题。
为什么不一样?因为你没有对服务器返回给你的响应进行处理,而是仅仅把返回原样输出。
浏览器是是对返回进行了处理的。
你目前得到的响应式跳转,而你没跳转。
浏览器得到响应和你的是一样的,而浏览器进行了跳转,最终结果就是你的和浏览器的不一样。
ua浏览器最起码有ua 现在网站很多基于ua返回获取网页内容是移动端还是pc
但是怎么才能实现我的要求呢,把百度的首页的发给我的response对象全部打印出来呢?
你那个IP是百度的么?换成180.97.33.108试试就知道了
其实只要换个IP就行了,程序里解析一下 www.baidu.com的IP,AAuto代码:
回复
我的猜测是百度判断你是通过什么域名进来的 然后返回页面 或者是跳转信息
回复
你试试 设置头部 Request URL:http://www.baidu.com/
no,no,百度首页至少有“网页”、“视频”、“音乐”、“文库”、“百科”等之类的a便签
结果其实是一样的,你打开浏览器的开发者工具,用这个IP的方式访问百度看看,就会发现浏览器也是有个跳转的
建议LZ 抓浏览器的包看下 你的header跟浏览器的是很不一样的
只有这条才是真的。。赞一个
是Socket和头的Host都得改,才能和浏览器的结果一样,有些想不明白啊
回复
不用谢,这些不用你说。我跟他说的是为什么他的程序打印的内容和通过浏览器访问百度返回的文本不一样的原因,你明白?
但是当我们用浏览器输入域名访问的时候,不都先解析成ip地址么?这和我直接用ip代替域名的方法有什么不同呢,用域名访问不都在请求服务器之前必须先转化成服务器IP地址吗?不管是DNS还是本地hosts文件,都得把域名换掉的
回复
这个的层次不一样,DNS解析是在HTTP传递给TCP的时候进行的,而HTTP头里的Host只是用于标记用户的请求,告诉服务器用户是怎么请求到这个服务器的。
回复
也正如我说得,强制跳转到www.baidu.com 是百度服务器的行为,是他们规定的,这个无需纠结。而这个跳转和 使用Ip还是域名访问无关,你使用baidu.com访问,百度服务器也会让你跳转到www.baidu.com。这就是百度服务器的一个保证来源正确CDN的一个技巧。
回复
学习了,谢谢