HTTP工作原理,为什么用程序的方式和用浏览器的方式,结果不一样

发布于 2021-11-22 19:47:26 字数 1994 浏览 830 评论 18

初次详细地学习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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(18

臻嫒无言 2021-11-27 20:13:36

对于程序没有立刻停止的问题,有两种简单的改法:

1. pw.println("GET / HTTP/1.0"); //这里改为1.0

2. pw.println("Connection:close"); //设置Connection属性

如果是复杂的改法就读响应头,判断Content-Length的值。更麻烦点的还要处理chunked传输问题。

囚你心 2021-11-27 20:13:36

为什么不一样?因为你没有对服务器返回给你的响应进行处理,而是仅仅把返回原样输出。

浏览器是是对返回进行了处理的。

你目前得到的响应式跳转,而你没跳转。

浏览器得到响应和你的是一样的,而浏览器进行了跳转,最终结果就是你的和浏览器的不一样。

多情癖 2021-11-27 20:13:36

ua浏览器最起码有ua 现在网站很多基于ua返回获取网页内容是移动端还是pc

风透绣罗衣 2021-11-27 20:13:35

但是怎么才能实现我的要求呢,把百度的首页的发给我的response对象全部打印出来呢?

琴流音 2021-11-27 20:13:35

你那个IP是百度的么?换成180.97.33.108试试就知道了

回忆凄美了谁 2021-11-27 20:13:35

其实只要换个IP就行了,程序里解析一下 www.baidu.com的IP,AAuto代码:

import console;
import wsock.tcp.client; 
var tcp = wsock.tcp.client() 

//取 www.baidu.com 的IP地址
var ip = wsock.getIp("www.baidu.com") 
tcp.connect(ip,80) 

sendData =/***********
GET /  HTTP/1.1
Host: www.baidu.com
Connection: close
User-Agent: Mozilla/4.0
Accept-Language: zh-CN,zh; 
Accept-Charset: GBK,utf-8;  
***********/
tcp.write( sendData + 'rnrn' )

for(str,size in tcp.eachRead() ){ 
    console.log(str);
    console.more( 25 )
} 

tcp.close() 
console.pause()

狼亦尘 2021-11-27 20:13:34

回复
我的猜测是百度判断你是通过什么域名进来的 然后返回页面 或者是跳转信息

青萝楚歌 2021-11-27 20:13:23

回复
你试试 设置头部 Request URL:http://www.baidu.com/

路还长,别太狂 2021-11-27 20:13:02

no,no,百度首页至少有“网页”、“视频”、“音乐”、“文库”、“百科”等之类的a便签

睫毛上残留的泪 2021-11-27 20:12:39

结果其实是一样的,你打开浏览器的开发者工具,用这个IP的方式访问百度看看,就会发现浏览器也是有个跳转的

平生欢 2021-11-27 20:12:29

建议LZ 抓浏览器的包看下 你的header跟浏览器的是很不一样的

琴流音 2021-11-27 20:11:30

只有这条才是真的。。赞一个

悲喜皆因你 2021-11-27 20:10:27

是Socket和头的Host都得改,才能和浏览器的结果一样,有些想不明白啊

酒几许 2021-11-27 19:25:52

回复
不用谢,这些不用你说。我跟他说的是为什么他的程序打印的内容和通过浏览器访问百度返回的文本不一样的原因,你明白?

眉黛浅 2021-11-27 17:46:42

但是当我们用浏览器输入域名访问的时候,不都先解析成ip地址么?这和我直接用ip代替域名的方法有什么不同呢,用域名访问不都在请求服务器之前必须先转化成服务器IP地址吗?不管是DNS还是本地hosts文件,都得把域名换掉的

柳絮泡泡 2021-11-27 11:56:56

回复
这个的层次不一样,DNS解析是在HTTP传递给TCP的时候进行的,而HTTP头里的Host只是用于标记用户的请求,告诉服务器用户是怎么请求到这个服务器的。

眼眸 2021-11-27 09:28:00

回复
也正如我说得,强制跳转到www.baidu.com 是百度服务器的行为,是他们规定的,这个无需纠结。而这个跳转和 使用Ip还是域名访问无关,你使用baidu.com访问,百度服务器也会让你跳转到www.baidu.com。这就是百度服务器的一个保证来源正确CDN的一个技巧。

心欲静而疯不止 2021-11-27 05:11:32

回复
学习了,谢谢

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文