`
economist
  • 浏览: 6025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Talk is cheap,用代码告诉你Http和Tcp的关系

阅读更多
本人菜鸟一枚,在此之前,我经常看到的一句话是“HTTP是基于TCP的”,但是,对于我这等菜鸟来说,实在太过高深。

没想到看了How Tomcat Works的第一章第一节的代码示例,我似乎明白了二者的关系。带着疑问,写了如下代码,来验证自己的设想。

首先,使用java的socket模拟client,注意不是使用httpclient这种封装好的工具。
执行之后,控制台输出了页面的源码。

代码如下
public class SimpleHttpClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("www.haosou.com", 80);
        
        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream(), "utf-8"));
        
        writer.println("GET / HTTP/1.1");
        writer.println("Host: www.haosou.com");
        writer.println("Connection: keep-alive");
        writer.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        writer.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36");
        writer.println("Accept-Language: zh-CN,zh;q=0.8");
        
        writer.println();  // 木有这一行,阻塞
        
        String line = reader.readLine();
        while (line != null) {
            System.out.println(line);
            line = reader.readLine();
        }
        
        writer.close();
        reader.close();
        socket.close();
    }
}


页面源码,如下
....
<script>LS.html2ls("stc_home_foot_js","stc_home_foot_js")</script>

</body>
</html>
篇幅原因,捧场的小伙伴可以自己跑下代码看一下。

如此,我基本验证了自己的猜想:Http是基于文本解析的约定,TCP负责传输

为了进一步验证,我又用Java的ServerSocket写了一个简陋的HttpServer,

启动该Server,也就是运行该代码,打开浏览器,在地址框输入http://localhost?name=Tom
可以看到页面显示了一个Tom的超链接,点击它,跳转到百度搜索的Tom页,当然,你可以不用Tom,而是用Jerry

代码如下,比较粗糙,将就看吧
public class SimpleHttpServer {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(80);
        while (true) {
            Socket socket = server.accept();
            new Task(socket).start();
        }
    }
}

class Task extends Thread {
    private Socket socket;
    
    public Task (Socket socket) {
        this.socket = socket;
    }
    
    public void run () {
        try {
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(), "utf-8"));
            
            // 获取请求中的参数, 忽略header神马的
            String firstLine = reader.readLine(); 
            String name = parseName(firstLine);  
            System.out.println("name:" + name);
            
            writer.println("<html>");
            writer.println("<body>");
            writer.println("<a href=\"https://www.baidu.com/s?wd=" + name +"&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_pq=9f77f8020000142e&rsv_t=af959DHMVRjqn9YFbiJw6m4svc%2Bs125HBrbqHOXkBFUxxNS4zBQgMjxhX1xr4cGzySAr&inputT=900&rsv_sug3=22&rsv_sug1=21&rsv_sug2=0&rsv_sug4=900\">" + name + "</a>");
            writer.println("</body>");
            writer.println("</html>");
            writer.println();
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String parseName(String line) {
        String query = line.substring(line.indexOf("?") + 1);
        query = query.substring(0, query.indexOf(" "));
        
        return query.split("=")[1];
    }
    
    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}


好了,这就是我目前理解到的Http和TCP的关系:如果用快递做比喻的话,卖家发货给买家是http请求,宝贝是http内容,快递公司是tcp,卖家和买家知道宝贝的详情,而快递公司不需要知道是什么,只负责传输,买卖方也无需关注快递细节。这个和其他网络分层是一样的——下层无需关注上层的内容,逻辑上,就像两个http直接对话。希望这个比喻,能给小伙伴的理解带来一定帮助。

附件中是我写的两个类,感兴趣的同学可以下载下来,木有额外的依赖,只用到JDK的包,改下package,就能运行

能力有限,多多指教。
2
2
分享到:
评论

相关推荐

    Talk is cheap, show me the code - 用 github 数据辅助你完善简历.zip

    Talk is cheap, show me the code - 用 github 数据辅助你完善简历.zip,Hacknical, hacker & technical. A website for GitHub user to make a better resume.

    Talk is Cheap.chm

    Talk is Cheap focuses on the increasingly popular services from Vonage, which uses VoIP, and Skype--a free service that operates as a peer-to-peer (P2P) network with the ability to turn any PC, Mac, ...

    Talk Is Cheap:Web 2.0 云攻击.pdf

    Talk Is Cheap:Web 2.0 云攻击.pdf

    第13讲 套接字Socket:Talk is cheap, show me the code1

    "Talk is cheap, show me the code1"这句标题暗示我们将深入到实际的代码层面,了解如何利用Socket进行TCP和UDP协议的编程。本讲主要讲解基于这两种协议的Socket编程基本流程。 首先,创建Socket时需要指定网络层和...

    Talk Is Cheap:Web 2.0 云攻击.zip

    《Talk Is Cheap:Web 2.0 云攻击》这篇文档深入探讨了Web 2.0环境下云服务面临的安全挑战。Web 2.0是指互联网发展的一个阶段,它强调用户参与、互动和共享,催生了诸如社交媒体、博客、在线协作平台等大量应用。...

    On cheap talk in games

    文章中提到的“cheap talk”是一个博弈论术语,意指没有实际强制力或承诺力的沟通。在博弈论中,尽管参与者之间可能会有交流,但是通常假设这些沟通不会影响博弈的结果,因为它们不能保证被遵守或执行。然而,现实中...

    13-套接字Socket:Talk is cheap, show me the code1

    Socket编程基于传输控制协议(TCP)或用户数据报协议(UDP),分别对应于面向连接的稳定通信和无连接的数据传输。 在TCP协议中,Socket编程的过程大致如下: 1. **创建Socket**:客户端和服务端首先都需要创建...

    TCP.rar_Talk Talk_tcp

    **TCP与IP的关系** TCP和IP通常一起提及,因为它们是互联网协议中最关键的两个。TCP提供端到端的可靠传输,而IP负责将数据包在网络中路由。TCP协议运行在IP之上,通过IP来实际传输数据。这种组合被称为TCP/IP协议栈...

    Google Talk窗口自绘代码

    C#开源代码 类GoogleTalk的界面 自绘的界面 里面带有调用的例子 从该窗口基类继承即可。

    tcp_wrappers_7.6-ipv6.4.tar.gz_Talk Talk_tcp_wrappers-7.6_tcp_wr

    With this package you can monitor and filter incoming requests for the SYSTAT, FINGER, FTP, TELNET, RLOGIN, RSH, EXEC, TFTP, TALK, and other network services.

    TCP_talk.rar_TCP 协议_Talk Talk

    tcp协议的简单聊天工程,由客户端、服务器组成,用c语言实现,可用于嵌入式linux网络编程中。

    基于TCP的聊天软件 CQ-Talk 源码

    基于TCP的聊天软件 CQ-Talk 源码,服务器端和客户端都有。VC6

    stl.zip_Talk Talk_echo_tcp协议的使用

    选择一个操作系统环境(Linux或者Windows),编制TCP/IP通信程序,完成一定的通信功能。例如:可以编一个程序和Unix的系统服务进行通信,如daytime(port ...或者两人talk,使用TCP/IP协议进行相互直接的发送和接收等。

    收集的完整参赛程序—近十个团队的

    6. **文档**:团队的设计理念、技术规格和使用说明,有助于理解程序的工作原理。 通过研究这些程序,不仅可以学习到Freescale微控制器的用法,还能了解如何将高级算法应用于实时控制系统,以及如何进行高效的嵌入式...

    Tcp talk.rar

    基于TCP的MFC聊天室,基于TCP协议的聊天程序,用VC++6.0 编写服务器与客户端之间的简单通信工具。的都是基于 winsocket运行的

    TCP/IP实现 简易聊天室 C++

    通过阅读和分析这部分代码,可以深入理解TCP/IP通信的基本流程,以及如何在C++中使用MFC进行网络编程。 总的来说,这个简易聊天室项目是一个很好的学习资源,它涵盖了网络编程的基础知识,如TCP连接、数据传输和多...

    TCP/IP聊天室C#版 C# 聊天工具

    而【压缩包子文件的文件名称列表】中的`win_talkClient`和`Win_Talk`很可能分别是客户端和服务器端的应用程序,包含了上述功能的实现代码。开发者可以通过查看这些源代码进一步学习和理解C#中TCP/IP聊天工具的实现...

    Android代码-T-MVP:泛型深度解耦下的MVP大瘦身

    Build more complex functions with cleaner code,talk is cheap ,show u the code: The following code to achieve the list of users to obtain the request, paging, display, just a sentence to achieve the...

Global site tag (gtag.js) - Google Analytics