本人菜鸟一枚,在此之前,我经常看到的一句话是“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,就能运行
能力有限,多多指教。
分享到:
相关推荐
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 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, show me the code1"这句标题暗示我们将深入到实际的代码层面,了解如何利用Socket进行TCP和UDP协议的编程。本讲主要讲解基于这两种协议的Socket编程基本流程。 首先,创建Socket时需要指定网络层和...
《Talk Is Cheap:Web 2.0 云攻击》这篇文档深入探讨了Web 2.0环境下云服务面临的安全挑战。Web 2.0是指互联网发展的一个阶段,它强调用户参与、互动和共享,催生了诸如社交媒体、博客、在线协作平台等大量应用。...
文章中提到的“cheap talk”是一个博弈论术语,意指没有实际强制力或承诺力的沟通。在博弈论中,尽管参与者之间可能会有交流,但是通常假设这些沟通不会影响博弈的结果,因为它们不能保证被遵守或执行。然而,现实中...
Socket编程基于传输控制协议(TCP)或用户数据报协议(UDP),分别对应于面向连接的稳定通信和无连接的数据传输。 在TCP协议中,Socket编程的过程大致如下: 1. **创建Socket**:客户端和服务端首先都需要创建...
**TCP与IP的关系** TCP和IP通常一起提及,因为它们是互联网协议中最关键的两个。TCP提供端到端的可靠传输,而IP负责将数据包在网络中路由。TCP协议运行在IP之上,通过IP来实际传输数据。这种组合被称为TCP/IP协议栈...
C#开源代码 类GoogleTalk的界面 自绘的界面 里面带有调用的例子 从该窗口基类继承即可。
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协议的简单聊天工程,由客户端、服务器组成,用c语言实现,可用于嵌入式linux网络编程中。
基于TCP的聊天软件 CQ-Talk 源码,服务器端和客户端都有。VC6
选择一个操作系统环境(Linux或者Windows),编制TCP/IP通信程序,完成一定的通信功能。例如:可以编一个程序和Unix的系统服务进行通信,如daytime(port ...或者两人talk,使用TCP/IP协议进行相互直接的发送和接收等。
6. **文档**:团队的设计理念、技术规格和使用说明,有助于理解程序的工作原理。 通过研究这些程序,不仅可以学习到Freescale微控制器的用法,还能了解如何将高级算法应用于实时控制系统,以及如何进行高效的嵌入式...
基于TCP的MFC聊天室,基于TCP协议的聊天程序,用VC++6.0 编写服务器与客户端之间的简单通信工具。的都是基于 winsocket运行的
通过阅读和分析这部分代码,可以深入理解TCP/IP通信的基本流程,以及如何在C++中使用MFC进行网络编程。 总的来说,这个简易聊天室项目是一个很好的学习资源,它涵盖了网络编程的基础知识,如TCP连接、数据传输和多...
而【压缩包子文件的文件名称列表】中的`win_talkClient`和`Win_Talk`很可能分别是客户端和服务器端的应用程序,包含了上述功能的实现代码。开发者可以通过查看这些源代码进一步学习和理解C#中TCP/IP聊天工具的实现...
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...