Web应用与http协议

Web应用

一 Web应用程序是什么

Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件

应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。WEB应用程序一般是B/S模式。Web应用程序首先是“应用程序”,和用标准的程序语言,如C、C++等编写出来的程序没有什么本质上的不同。然而Web应用程序又有自己独特的地方,就是它是基于Web的,而不是采用传统方法运行的。换句话说,它是典型的浏览器/服务器架构的产物。

1.1 Web应用程序的优点

  • 网络应用程序不需要任何复杂的“展开”过程,你所需要的只是一个适用的浏览器;
  • 网络应用程序通常耗费很少的用户硬盘空间,或者一点都不耗费;
  • 它们不需要更新,因为所有新的特性都在服务器上执行,从而自动传达到用户端;
  • 网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
  • 因为它们在网络浏览器窗口中运行,所以大多数情况下它们是通过跨平台使用的 (例如Windows,Mac,Linux等等)

1.2 Web应用程序的缺点

  • 网络应用程序强调浏览器的适用性。如果浏览器方没有提供特定的功能,或者弃用特定的平台或操作系统版本(导致不适用),就会影响大量用户;
  • 网络应用依靠互联网远程服务器端的应用文件。因此,当连接出问题时,应用将不能正常使用。
  • 许多网络应用程序不是开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,而且大多数情况下用户不能离线使用,因而损失了很多灵活性;
  • 它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。对比而看,即使软件制造商倒闭了,传统的安装软件也可以继续运行,尽管不能再更新或有其他用户服务;
  • 相似地,提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。
  • 公司理论上可以检索任何的用户行为。这有可能引起隐私安全问题。

1.3 B/S架构优点

浏览器/服务器架构(Browser/Server,简称B/S)能够很好地应用在广域网上,成为越来越多的企业的选择。浏览器/服务器架构相对于其他几种应用程序体系结构,有如下3方面的优点:

  • 这种架构采用Internet上标准的通信协议(通常是TCP/IP协议)作为客户机同服务器通信的协议。这样可以使位于Internet任意位置的人都能够正常访问服务器。对于服务器来说,通过相应的Web服务和数据库服务可以对数据进行处理。对外采用标准的通信协议,以便共享数据。
  • 在服务器上对数据进行处理,就处理的结果生成网页,以方便客户端直接下载。
  • 在客户机上对数据的处理被进一步简化,将浏览器作为客户端的应用程序,以实现对数据的显示。不再需要为客户端单独编写和安装其他类型的应用程序。这样,在客户端只需要安装一套内置浏览器的操作系统,直接安装一套浏览器,就可以实现服务器上数据的访问。而浏览器是计算机的标准设备

总结一下,本质上:浏览器是一个socket客户端,服务器是一个socket服务端

二 基于SOCKET写一个web应用

2.1 main.py

import socketdef server_run():soc = socket.socket()soc.bind(('127.0.0.1', 8008))soc.listen(5)while True:conn, addr = soc.accept()recv_data = conn.recv(1024)print(recv_data)# 1 直接在send里写,发送给客户端# conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>')#2 打开一个html文件,发送给客户端# with open('index.html','r',encoding='utf-8') as f:#     data=f.read()# conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))# 3 动态网页,字符串替换import timenow=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print(now)with open('index.html','r',encoding='utf-8') as f:data=f.read()data=data.replace('@@@',now)conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))conn.close()if __name__ == '__main__':server_run()

2.2 index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>@@@</h2><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg" alt="">
</body>
</html>

三 手撸简单web框架

3.1 main.py

import socketimport pymysql
def index(request):return '<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>'def login(request):with open('login.html','r',encoding='utf-8') as f :data=f.read()return data
def time(request):import datetimenow=datetime.datetime.now().strftime('%Y-%m-%d %X')with open('time.html','r',encoding='utf-8') as f :data=f.read()data=data.replace('@@time@@',now)return data
def user_list(request):# 创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user")user_list = cursor.fetchall()cursor.close()conn.close()tr_list=[]for row in user_list:tr='<tr><td>%s</td><td>%s</td><td>%s</td></tr>'%(row['id'],row['name'],row['password'])tr_list.append(tr)with open('user_list.html','r',encoding='utf-8') as f:data=f.read()data=data.replace('@@body@@',''.join(tr_list))return datadef user_list_new(request):# 创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user")user_list = cursor.fetchall()cursor.close()conn.close()with open('user_list_new.html','r',encoding='utf-8') as f:data=f.read()from jinja2 import Templatetemplate=Template(data)response=template.render(user_list=user_list)# response=template.render({'user_list':user_list})return responseurls = [('/index', index),('/login', login),('/time', time),('/user_list', user_list),('/user_list_new', user_list_new),
]def run():soc = socket.socket()soc.bind(('127.0.0.1', 8006))soc.listen(5)while True:conn, port = soc.accept()data = conn.recv(1024)# data=data.decode('utf-8')print(data)data = str(data, encoding='utf-8')request_list = data.split('\r\n\r\n')head_list = request_list[0].split('\r\n')method, url, htt = head_list[0].split(' ')# conn.send(b'hello web')conn.send(b'HTTP/1.1 200 OK \r\n\r\n')print(url)func_name = Nonefor u in urls:if url == u[0]:func_name = u[1]breakif func_name:response = func_name(data)else:response = '404 not found'conn.send(response.encode('utf-8'))conn.close()if __name__ == '__main__':run()

3.2 login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action=""><p>用户名:<input type="text"></p><p>密码:<input type="password"></p></form>
</body>
</html>

3.3 time.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>@@time@@
</body>
</html>

3.4 user_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body><table border="1"><thead><tr><th>id</th><th>用户名</th><th>密码</th></tr></thead><tbody>@@body@@</tbody></table></body>
</html>

3.5 user_list_new

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body>
<table border="1"><thead><tr><th>id</th><th>name</th><th>password</th></tr></thead><tbody>{% for user in user_list%}<tr><td>{{user.id}}</td><td>{{user.name}}</td><td>{{user.password}}</td></tr>{%endfor%}</tbody></table></body>
</html>

 HTTP协议

一 http协议简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

二 http协议特性

2.1 基于TCP/IP协议之上的应用层协议

2.2 基于请求-响应模式

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

2.3 无状态保存

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管 理状态了。有关Cookie的详细内容稍后讲解

2.4 无连接

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

三 http请求协议与响应协议

http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字 文本。

3.1 请求协议

请求格式

请求方式: get与post请求
  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
  • GET与POST请求在服务端获取请求数据方式不同。
##### GET请求##### ##### 
'''
########### 请求首行####################
GET / HTTP/1.1\r\n
# get请求后面的参数
GET /?name=lqz&age=18 HTTP/1.1\r\n
##################### 请求头####################
Host: 127.0.0.1:8008\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: csrftoken=7xx6BxQDJ6KB0PM7qS8uTA892ACtooNbnnF4LDwlYk1Y7S7nTS81FBqwruizHsxF\r\n\r\n'
################ 请求体####################
(get请求,请求体为空)    
'''##### POST请求##### ##### 
'''################请求首行################
POST /?name=lqz&age=18 HTTP/1.1\r\n
################请求头################
Host: 127.0.0.1:8008\r\n
Connection: keep-alive\r\n
Content-Length: 21\r\n
Cache-Control: max-age=0\r\n
Origin: http://127.0.0.1:8008\r\n
Upgrade-Insecure-Requests: 1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Referer: http://127.0.0.1:8008/?name=lqz&age=18\r\n
Accept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n
Cookie: csrftoken=7xx6BxQDJ6KB0PM7qS8uTA892ACtooNbnnF4LDwlYk1Y7S7nTS81FBqwruizHsxF\r\n\r\n################请求体################
name=lqz&password=123'
'''

3.2 响应协议

响应格式

3.3 响应状态码

状态码的职 是当客户端向服务器端发送请求时, 返回的请求 结果。借助状态码,用户可以知道服务器端是正常 理了请求,还是出 现了 。状态码如200 OK,以3位数字和原因 成。数字中的 一位指定了响应 别,后两位无分 。响应 别有以5种。

四 URL简介

统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

格式:

协议://IP:端口(80)/路径?name=lqz&age=18

?之前的是请求路径,?之后的是请求数据部分

演示示例:

import socketsock=socket.socket()
sock.bind(("127.0.0.1",8808))
sock.listen(5)while 1:print("server waiting.....")conn,addr=sock.accept()data=conn.recv(1024)print("data", data)# 读取html文件with open("login.html","rb") as f:data=f.read()conn.send((b"HTTP/1.1 200 OK\r\nContent-type:text/html\r\n\r\n%s"%data))conn.close()
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="" method="post">用户名 <input type="text" name="user">密码 <input type="password" name="pwd"><input type="submit">
</form></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶视觉感知技术

1、视觉感知 2、应用功能 3、视觉感知支持的功能 4、软硬件产品 5、DMS、手势识别、行为检测 6、DMS视觉检测 7、驾驶员离位检测 8、安全带检测 9、双手脱离方向盘检测 10、后排遗留物检测 11、360环视AVM倒车指引线MOD 12、盲区监测

STM32算法

1.通过编码器对返回的错误速度进行滤波 #define MOTOR_BUFF_CIRCLE_SIZE 4 #define STATIC_ENCODER_VALUE 6int32_t LMotor_Encoder_buff[MOTOR_BUFF_CIRCLE_SIZE] {0}; uint8_t LEindex 0; int32_t LMotor_Encoder_last 0; int32_t L_Encoder_change 0;int32_t RMotor_…

上门预约互联网干洗店洗鞋店小程序开发

很多时候可能大家的衣服鞋子需要干洗&#xff0c;但又不想出门送去店里&#xff0c;大家就可以使用手机线上下单预约取货&#xff0c;会有专门的人上门来取衣服&#xff0c;让你能够轻松的进行洗护。 闪站侠洗衣洗鞋小程序&#xff0c;提供了足不出户就能预约人员上门去 衣送洗…

C 语言头文件

C 语言头文件 头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它…

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2023年第10期目录

教育视点 核心素养导向下的初中化学大单元教学研究 陈玉霞; 3-5 核心素养下的英语大单元教学策略 马玲凤; 6-8 盲校初中语文课堂教学特点及教学策略 王瀚文;王彩云; 9-11 新课改背景下高中语文教学语言的运用探讨 王文静; 12-14《中学课程辅导》投稿&#xff1…

第二十章,多线程

创建线程 有两种方式&#xff0c;分别为继承Java.lang.Thread类与实现Java.lang.Runnable接口 继承Thread类 Thread常用的两个构造方法语法 public Thread&#xff08;&#xff09;&#xff1b; public Thread&#xff08;String threadName&#xff09;&#xff1b; 继承…

NOI / 1.10编程基础之简单排序 提问01:谁考了第k名 c语言 结构体

描述 在一次考试中&#xff0c;每个学生的成绩都不相同&#xff0c;现知道了每个学生的学号和成绩&#xff0c;求考第k名学生的学号和成绩。 输入 第一行有两个整数&#xff0c;分别是学生的人数n&#xff08;1≤n≤100&#xff09;&#xff0c;和求第k名学生的k&#xff08…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》&#xff08;9&#xff09; 4 Linux 进程管理4.5 Linux 信号4.5.1 信号的作用和种类1.信号机制2.信号种类 4.5.2 信号的处理4.5.3 信号处理函数1&#xff0e;数据结构2&#xff0e; 处理函数 signal3&#xff0e;程序例 4 Linux 进…

论文阅读:“Appearance Capture and Modeling of Human Teeth”

文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影&#xff0c;游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…

原生js和jQuery的区别

1. 原生JavaScript是一种基于ECMAScript规范的编程语言&#xff0c;而jQuery是基于JavaScript的一个库&#xff0c;它提供了一种更简洁、易用的语法来操作HTML文档、处理事件、执行动画等。 2. 原生JavaScript没有依赖任何外部库&#xff0c;而jQuery依赖于jQuery库。这意味着…

【RTP】4: 实例解析:一个SRTP的wireshark抓包:带padding、带扩展

抓取的是视频包。固定的pt是127从头部找到序号,快速找到这个包包大小因为是包括了SRTP的,所以318 个字节,实际RTP包是286个字节。SRTP 包 UDP总共 294个字节,payload部分286 RTP协议 RTP部分: B0 代表有padding、有扩展 从B0开始

Kylin操作系统安装mysql8,Neginx相关问题记录

文章目录 一、Linux常见命令记录1. 为普通用户赋sudo权限2. Kylin系统yum配置以及使用2.1 Kylin操作系统yum源配置(本地yum源)2.1.1 .repo类型文件存在2.1.2 .repo类型文件不存在2.1.3 挂载OS镜像文件2.1.4 编辑local.repo文件&#xff0c;创建yum源地址2.1.5使yum源生效 2.2 y…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

Linux网络——数据链路层

目录 一.认识以太网 二.以太网帧格式 三.认识MAC地址 四.认识MTU 五.以太局域网的通信原理 六.其他重要协议 1.DNS协议 2.域名简介 3.ICMP协议 4.NAT技术 5.NAT技术的缺陷 6.NAT和代理服务器 一.认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标…

浅谈基于EIoT能源物联网的工厂智能照明系统应用改造

【摘要】&#xff1a;随着物联网技术的发展&#xff0c;许多场所针对照明合理应用物联网照明系统&#xff0c;照明作为工厂的重要能耗之一&#xff0c;工厂的照明智能化控制&#xff0c;如何优化控制、提高能源的利用率&#xff0c;达到节约能源的目的。将互联网的技术应用到工…

【C语言】Debian10使用zlib库crc32()函数

crc32函数原型 uint32_t crc32(uint32_t crc, const Bytef *buf, uInt len); 参数说明 crc&#xff1a;初始的CRC值或者之前计算得到的CRC值。在初次调用时&#xff0c;通常使用0xFFFFFFFF作为初始值。buf&#xff1a;指向数据缓冲区的指针&#xff0c;包含需要计算CRC的数据…

Python字典合并

合并两个有部分key相同的字典&#xff0c;相同key保留两个字典中对应key的较大值。 (笔记模板由python脚本于2023年11月27日 18:12:15创建&#xff0c;本篇笔记适合熟悉Python字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fr…

笔记十九*、选中高亮和嵌套路由使用

19.1 选中高亮 NavLink App.jsx import React from "react"; import {NavLink, useRoutes} from "react-router-dom"; import routes from "./routes/index.jsx"; import "./app.css"const App () > {const element useRoutes(…

Kotlin(十二) 定义静态方法

静态方法在某些编程语言里面又叫作类方法&#xff0c;指的就是那种不需要创建实例就能调用的方法&#xff0c;所有主流的编程语言都会支持静态方法这个特性。 在Java中定义一个静态方法非常简单&#xff0c;只需要在方法上声明一个static关键字就可以了&#xff0c;如下所示&a…