前言

先在文章前面说好了,省得大家发现我根本没有这样的头发,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)的更多相关文章

  1. Cookie详解、ASP.NET核心知识(7)

    无状态的http协议 1.回顾http协议 Http协议是请求响应式的,有请求才有响应,是无状态的,不会记得上次和网页“发生了什么”. 关于http协议的这种特点,黑兔在前面的这三篇博文中进行了详细的 ...

  2. 手写一个简版 asp.net core

    手写一个简版 asp.net core Intro 之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架,最近参考蒋老师和 Edison 的文章和代码,结合自己对 asp ...

  3. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  4. 写一个简易web服务器、ASP.NET核心知识(4)

    前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...

  5. 网络基础知识、ASP.NET 核心知识(1)*

    为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...

  6. 手写一个简易的IOC

    这个小项目是我读过一点Spring的源码后,模仿Spring的IOC写的一个简易的IOC,当然Spring的在天上,我写的在马里亚纳海沟,哈哈 感兴趣的小伙伴可以去我的github拉取代码看着玩 地址 ...

  7. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  8. 如何写一个跨浏览器的事件处理程序 js

    如何 写一个合格的事件处理程序,看如下代码: EventUtil可以直接拿去用 不谢 <!DOCTYPE html> <html> <head> <title ...

  9. 来,我们手写一个简易版的mock.js吧(模拟fetch && Ajax请求)

    预期的mock的使用方式 首先我们从使用的角度出发,思考编码过程 M1. 通过配置文件配置url和response M2. 自动检测环境为开发环境时启动Mock.js M3. mock代码能直接覆盖g ...

随机推荐

  1. Java对象创建过程补遗

    一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...

  2. 软工网络15团队作业4-DAY6

    每日例会 昨天的工作. 张陈东芳:sql语句查询商品信息 吴敏烽:商品类的规范化编写 周汉麟:界面的排版优化 林振斌:商品类排序的实现 李智:研究商品信息的显示 全体人员:初次统一调试 今天计划的工作 ...

  3. 3.结对编程成果报告(小学生四则运算的出题程序,Java实现)

    程序名称:小学生四则运算的出题程序 先附上代码: package com.makequestion; import java.text.DecimalFormat;import java.util.R ...

  4. 【beta】nice!-------约吧NABCD

    小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 约吧APP下载地址: 百度云:链接:http://pan.baidu.com/s/1jHNBR3g ...

  5. PHP之array_flip()方法

    array_flip — 交换数组中的键和值 array array_flip ( array $trans ) array_flip() 返回一个反转后的 array,例如 trans 中的键名变成 ...

  6. POJ 3276 Face The Right Way(前缀和优化)

    题意:有长度为N的01串,有一个操作可以选择连续K个数字取反,求最小的操作数和最小的K使得最后变成全1串.(N<=5000) 由于K是不定的,无法高斯消元. 考虑枚举K,求出最小的操作数. 显然 ...

  7. 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

    题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...

  8. liunx 用户和用户组的命令

    查看用户列表     /etc/passwd  查看用户组列表 /etc/group 用户和用户组管理 groupadd groups 新增用户组 groupmod -n newgroupsr gro ...

  9. 【JavaScript&jQuery】轮展图

    用bootstrap实现轮展图和用Jquery自定义轮展图两种   1.使用bootstrap插件 效果图: 用一个超简单的方法,那就是用bootstrap的插件,什么?不懂bootstrap?没关系 ...

  10. Mybatis笔记四:Mybatis中的resultType和resultMap查询操作实例详解

    resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比 ...