Web01 基础
网址组成(四部分)
协议 http,https (https是加密的http)
主机 g.cn zhihu.com之类的网址
端口 HTTP协议默认80,因此一般不用填写
路径 下面的 / 和 /question/31838184
http://www.zhihu.com/question/31838184
电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑自动向DNS服务器(domain name server)查询域名对用的IP地址
比如g.cn这样的网址,可以通过电脑的ping程序查出对应的IP地址
--> ping g.cn
PING g.cn(74.125.69.160):56 data bytes
端口是什么
一个比喻
用邮局互相写信的时候,ip相当于地址(也可看做邮编,地址是域名)
端口是收信人姓名(因为一个地址比如公司,家只有一个地址,但是却可能有很多收信人)
端口就是一个标记收信人的数字
端口是一个16位的数字,所以范围是0-65535(2**16)
-------HTTP协议---------
一个传输协议,协议就是双方都遵守的规范
为什么叫超文本传输协议呢,因为收发的是文本信息
1 浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器
2 服务器解析请求,按照规定的格式返回文本数据到浏览器
3 浏览器解析得到的数据,并做相印的处理
请求和返回时一样的数据格式,分为四部分:
1 请求行或响应行
2 Header (请求的Header中Host字段是必须的,其他都是可选的)
3 、\r\n\r\n (连续两个换行回车符,用来分隔Header和Body)
4 Body(可选)
- 请求的格式 ,注意大小写(这是一个不包含Body的请求):
- 原始数据如下:
- 'GET / HTTP/1.1\r\nh\ host:g.cn\r\n\r\n'
- 打印出来如下
- GET / HTTP/1.1
- Host: g.cn
其中
1 GET 是请求方法(还有POST等
2 / 是请求路径(这代表根路径)
3 HTTP/1.1中,1.1是版本号,通用了20年
具体字符串是'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n'
- 返回的数据如下
- HTTP/1.1 301 Moved Permanently
- Alternate-Protocol: 80:quic,p=0,80:quic,p=0
- Cache-Control: private, max-age=2592000
- Content-Length: 218 // Body部分的长度
- Content-Type: text/html; charset=UTF-8 // Body是什么类型的 文本类型html格式 并且编码是utf8
- Date: Tue, 07 Jul 2015 02:57:59 GMT
- Expires: Tue, 07 Jul 2015 02:57:59 GMT
- Location: http://www.google.cn/
- Server: gws // google webserver
- X-Frame-Options: SAMEORIGIN
- X-XSS-Protection: 1; mode=block
Body部分太长先不贴了
其中响应行(第一行)
1 HTTP/1.1 是版本号
2 301 是状态码, 参见文末链接
3 Moved Permanently 是状态码的描述
浏览器会自己解析Header部分,然后将Body显示成网页
---------web服务器做什么-----------
主要是解析请求,发送相应的数据给客户端
例如附件中的代码(client.py)就是模拟浏览器发送HTTP请求给服务器并把收到的所有信息打印出来(使用的是最底层的socket,现阶段不必关心这种底层,web开发是上层开发)
- # coding: utf-8
- import socket
- # socket 是操作系统用来进行网络通信的底层方案
- # 简而言之, 就是发送 / 接收数据
- # 创建一个 socket 对象
- # 参数 socket.AF_INET 表示是 ipv4 协议
- # 参数 socket.SOCK_STREAM 表示是 tcp 协议
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # 这两个其实是默认值, 所以你可以不写, 如下
- # s = socket.socket()
- # s = ssl.wrap_socket(socket.socket())
- # 主机(域名或者ip)和端口
- host = 'g.cn'
- port = 80
- # 用 connect 函数连接上主机, 参数是一个 tuple
- s.connect((host, port))
- # 连接上后, 可以通过这个函数得到本机的 ip 和端口
- ip, port = s.getsockname()
- print('本机 ip 和 port {} {}'.format(ip, port))
- # 构造一个 HTTP 请求
- http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host)
- # 发送 HTTP 请求给服务器
- # send 函数只接受 bytes 作为参数
- # str.encode 把 str 转换为 bytes, 编码是 utf-8
- request = http_request.encode('utf-8')
- print('请求', request)
- s.send(request)
- # 接受服务器的响应数据
- # 参数是长度, 这里为 1023 字节
- # 所以这里如果服务器返回的数据中超过 1023 的部分你就得不到了
- response = s.recv(1023)
- # 输出响应的数据, bytes 类型
- print('响应', response)
- # 转成 str 再输出
- print('响应的 str 格式', response.decode('utf-8'))
client.py
- import socket
- # 这个程序就是一个套路程序, 套路程序没必要思考为什么会是这样
- # 记住套路, 能用, 就够了
- # 运行这个程序后, 浏览器打开 localhost:2000 就能访问了
- #
- # 服务器的 host 为空字符串, 表示接受任意 ip 地址的连接
- # post 是端口, 这里设置为 2000, 随便选的一个数字
- host = ''
- port = 2000
- # s 是一个 socket 实例
- s = socket.socket()
- # s.bind 用于绑定
- # 注意 bind 函数的参数是一个 tuple
- s.bind((host, port))
- # 用一个无限循环来处理请求
- while True:
- # 套路, 先要 s.listen 开始监听
- # 注意 参数 5 的含义不必关心
- s.listen(5)
- # 当有客户端过来连接的时候, s.accept 函数就会返回 2 个值
- # 分别是 连接 和 客户端 ip 地址
- connection, address = s.accept()
- # recv 可以接收客户端发送过来的数据
- # 参数是要接收的字节数
- # 返回值是一个 bytes 类型
- request = connection.recv(1024)
- # bytes 类型调用 decode('utf-8') 来转成一个字符串(str)
- print('ip and request, {}\n{}'.format(address, request.decode('utf-8')))
- # b'' 表示这是一个 bytes 对象
- response = b'<h1>Hello World!</h1>'
- response = b'HTTP/1.1 233 VERY OK\r\n\r\n<h1>Hello World!</h1>'
- # 用 sendall 发送给客户端
- connection.sendall(response)
- # 发送完毕后, 关闭本次连接
- connection.close()
http.py
HTTP Header
- GET / HTTP/1.1
- Host: localhost:2000
- Connection: keep-alive
- Upgrade-Insecure-Requests: 1
- User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- Accept-Encoding: gzip, deflate, br
- Accept-Language: zh-CN,zh;q=0.9
- GET /favicon.ico HTTP/1.1
- Host: 127.0.0.1:2000 // 必须需要
- Connection: keep-alive // 服务器不会立即关闭连接 下次浏览器会继续用这个连接发送请求 TC协议P链接
- User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
- Accept: image/webp,image/apng,image/*,*/*;q=0.8 // 可以接收什么数据 左边类型右边格式 ,逗号分隔 ;分号分隔q=0.9是权重
- Referer: http://127.0.0.1:2000/
- Accept-Encoding: gzip, deflate, br // 能接收的编码 压缩的格式 这是个压缩算法
- Accept-Language: zh-CN,zh;q=0.9 // 权重 等价优先级
课程参考书
---如果 Python 基础不扎实, 可以参考 Python 学习手册
HTML CSS 知识只推荐一本(之后会有专门的课讲解 CSS), 自行学习 https://item.jd.com/1060167433.html
Web01 基础的更多相关文章
- nginx应用总结(1)--基础认识和应用配置
在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...
- awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
- Linux系统基础优化
一.关闭防火墙iptables: (1)关闭 /etc/init.d/iptables stop (2)检查 ...
- Nginx入门篇-基础知识与linux下安装操作
我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...
- linux 基础测试题
1. 什么是buffer和cache buffer (cpu→内存→磁盘,简称为写缓冲 ):当你网上观看视频且网络波动较大的时候,会发现弹出一个正在缓冲中,这个就是buffer. cache(磁盘→内 ...
- nginx应用总结(1)-- 基础知识和应用配置梳理
在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...
- 001.linux的基础优化(期中架构方面的优化)
1. linux内核优化 第一步 cat >>/etc/sysctl.conf<<EOF net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_t ...
- shell编程基础进阶
为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...
- (转)nginx应用总结(1)--基础认识和应用参数优化配置
在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...
随机推荐
- VUE的使用方法
vueInit: function() { var _this = this; this.vue = new Vue({ el: '#pa', data: { //存放初始化数据 sourceData ...
- windows dos权限管理
显示或者修改文件的访问控制列表(ACL) CACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm] ...
- IntelliJ IDEA 基础设置
原文地址:IntelliJ IDEA 基础设置 博客地址:http://www.extlight.com 一.前言 IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,Intel ...
- PhoneGap 获得APP的VersionName
1.首先安装cordova-plugin-app-version cordova plugin add cordova-plugin-app-version 2. 调用方法如下 function ge ...
- NET基础篇——反射的奥妙
反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflectio ...
- 三大运营商2G/3G/4G频率分配和网络制式
经过二十多年长期的发展,我国的通信业逐渐形成了2G/3G/4G并存的局面,手机通讯信号传输都是通过一定频率传输的,而三大运营商所拥有的频率和网络制式不尽相同,这就造成同一部手机在三大运营商之间可能不通 ...
- 详解Oracle的几种分页查询语句
转载自:http://database.51cto.com/art/200904/118737.htm 分页查询格式: SELECT * FROM (SELECT A.*, ROWNUM RN FRO ...
- 第1课 GUI程序原理分析
1. 命令行应用程序 (1)命令行应用程序的特点 ①是一种基于顺序执行结构的可执行程序 ②程序执行过程中不需要与用户产生交互 ③程序执行后给出最终的运行结果 (2)命令行应用程序的运行模式——程序运行 ...
- Spring batch学习 详细配置解读(3)
第一篇讲到普通job 配置 那么spring batch 给我们提供了丰富的配置,包括定时任务,校验,复合监听器,父类,重启机制等. 下面看一个动态设置读取文件的配置 1.动态文件读取 <?x ...
- python Flask篇(一)
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...