写一个简易浏览器、ASP.NET核心知识(3)
前言
先在文章前面说好了,省得大家发现我根本没有这样的头发,duang的一下一堆人骂我。
这篇文章的标题有点大,其实挺low的,我需要在开头解释一下。我这里只想写一个小的控制台,旨在模拟浏览器的http通信。
不是真的能用的浏览器。
简单的说,今天的全部工作就是
建立Socket→发送请求报文→ 服务器返回报文→显示报文。仅此而已喏。
实话说出来,是不是一下就low了?
我的目的只有两个。 1.加深对http协议的理解 2.深化对B/S结构的认识。
如果您已经非常了解这些东西了。那就甭搭理我,让我自娱自乐一会就好了。
理论支持
1.http工作原理
上一篇文章介绍了,http协议的运行机制,简单的说就是这样一张图。
2.浏览器工作原理
根据这个运行机制,我猜测浏览器的工作原理应该是这样的。
当然,这个原理图里,我刻意的忽略了浏览器 解释javascript的能力、缓存管理的能力等等......
主要原因是,都考虑进去图就太复杂了。背离了我们研究http协议,理解B/S模式的初衷。
当然了,根本原因是,我不会! (突然好悲伤啊。。。不说了,我先哭一会)
代码
1.思路
思路没什么好说的就是上面那张图。
建立Socket→发送请求报文→ 服务器返回报文→显示报文。
2.代码
/*
这个程序把主机地址写死了,
想更像的话,可以在加个输入。然后根据输入的url获取 响应报文。
*/ Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
//连接服务器。http协议默认的端口号是80。每个服务器软件监听一个端口(别的软件就不能监听这个端口了),发送给这个端口的数据只会被这个服务器软件接收到。
socket.Connect(new DnsEndPoint("127.0.0.1", ));
//读写socket通讯数据的流
using (NetworkStream netStream = new NetworkStream(socket))
using (StreamWriter writer = new StreamWriter(netStream))
{
//这里就是写之前 讲的请求报文,偷点懒,不多写了
writer.WriteLine("GET /index.html HTTP/1.1");
writer.WriteLine("Host: 127.0.0.1:8080");
//空行回车,表示指令结束
//还记得http请求报文格式吗?报文头和报文体之间用一个空行回车隔开。
writer.WriteLine();
}
//开始读喽
using (NetworkStream netStream = new NetworkStream(socket))
using (StreamReader reader = new StreamReader(netStream))
{
string line;
while ((line = reader.ReadLine())!=null)
{
//读一行输出一行
Console.WriteLine(line);
}
}
//几个释放资源
socket.Disconnect(false);
调试
1.预期效果
没错,这就是浏览器请求IIS欢迎页面的响应报文。如果我们的控制台能输出一样的响应报文,证明实验成功了!!
2.调试结果
响应的报文正确的显示出来了呢。成功了喏!
实验结束的感言
做完这个东西,貌似没什么成就感哈!
但是这个程序让我更加了解了http协议,和B/S结构。
诸位看到了,浏览器是发送请求报文,服务器根据请求报文返回响应报文。浏览器/服务器的基础原理就是这样的。
请求/响应式,没有请求就没有响应。 (当然了,后面还能说到消息推送,但那是后话!)
写一个简易浏览器、ASP.NET核心知识(3)的更多相关文章
- Cookie详解、ASP.NET核心知识(7)
无状态的http协议 1.回顾http协议 Http协议是请求响应式的,有请求才有响应,是无状态的,不会记得上次和网页“发生了什么”. 关于http协议的这种特点,黑兔在前面的这三篇博文中进行了详细的 ...
- 手写一个简版 asp.net core
手写一个简版 asp.net core Intro 之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架,最近参考蒋老师和 Edison 的文章和代码,结合自己对 asp ...
- Summer——从头开始写一个简易的Spring框架
Summer--从头开始写一个简易的Spring框架 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...
- 写一个简易web服务器、ASP.NET核心知识(4)
前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...
- 网络基础知识、ASP.NET 核心知识(1)*
为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...
- 手写一个简易的IOC
这个小项目是我读过一点Spring的源码后,模仿Spring的IOC写的一个简易的IOC,当然Spring的在天上,我写的在马里亚纳海沟,哈哈 感兴趣的小伙伴可以去我的github拉取代码看着玩 地址 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 如何写一个跨浏览器的事件处理程序 js
如何 写一个合格的事件处理程序,看如下代码: EventUtil可以直接拿去用 不谢 <!DOCTYPE html> <html> <head> <title ...
- 来,我们手写一个简易版的mock.js吧(模拟fetch && Ajax请求)
预期的mock的使用方式 首先我们从使用的角度出发,思考编码过程 M1. 通过配置文件配置url和response M2. 自动检测环境为开发环境时启动Mock.js M3. mock代码能直接覆盖g ...
随机推荐
- 1029 C语言文法定义
program à external_declaration | program external_declaration <源程序> -> <外部声明> | < ...
- 微信小程序 功能函数 touch触摸计时
shiFN:function(e){ // touchstart // touchend let that=this; let n=0; // 判断是开始还是结束的参数 let textTure = ...
- tooltips & click copy
tooltips & click copy shit antd & tooltips & click copy https://codesandbox.io/s/zx4wo7y ...
- linux下sublime text 3安装到配置
1. Sublime Text 3的下载安装 到官方网站上http://www.sublimetext.com/3下载64位(系统位64位)的.deb安装包(http://c758482.r82.cf ...
- BZOJ3591 最长上升子序列(状压dp)
之前听说过一种dp套dp的trick,大致是用另一个dp过程中用到的一些东西作为该dp的状态.这个题比较类似. 考虑求LIS时用到的单调队列.设f[S]为所选取集合为S的方案数,其中在单调队列内的标2 ...
- C++解析(19):函数对象、关于赋值和string的疑问
0.目录 1.函数对象 2.重载赋值操作符 3.string类 4.小结 1.函数对象 编写一个函数: 函数可以获取斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 实现功能: #i ...
- VS的IISExpress配置通过IP访问程序
打开C:\Users\用户\Documents\IISExpress\config\applicationhost.config 获取本地VS项目运行起来的端口,比如 然后在文本里搜索 24395 ...
- BZOJ2743:[HEOI2012]采花——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2743 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建 ...
- 网络编程----粘包以及粘包问题的解决、FTP上传
一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意: res=subprocess.Popen(cmd.decode('u ...
- 流媒体协议之JRTPLIB的使用20170919
主要介绍JRTPLIB 2.x系列和3.x系列两种版本,它们的区别是2.x系列代码量少使用简单,但是只支持RFC 1889不支持RFC 3550,3.x支持RFC 3550,但代码量稍多,以及使用也稍 ...