web框架的本质初识

news2024/10/9 16:22:37

1.什么是HTML

HTML是一个超文本语言,是一种创建网页结构的标记语言。就是你女朋友化妆之后的样子

2.什么是HTTP协议

是一种用于在Web上传输数据的协议。它是客户端和服务器之间进行相互通信的基础的协议

3.HTTP的特点

无连接:每个http请求都是独立·的

无状态:不会保存客户端之间的信息,每个请求的是独立的

简单:代码简单易懂

超文本:可以传输除了文本之外的数据

4.如何建立TCP客户端和服务端连接(写代码)

#  客户端
import socket

# 在循环外部创建 socket 实例
client = socket.socket()

# 连接服务器
client.connect(('127.0.0.1',9696))

while True:
    # 发送消息
    send_msg = input('请输入消息 :>>>>>').strip()
    if not send_msg: continue
    client.send(send_msg.encode('utf-8'))
    if send_msg == 'q':
        break
    # 接受消息
    msg = client.recv(1024)
    print(msg.decode('utf-8'))

# 关闭连接
client.close()
# 服务端
import socket

# 在循环外部创建 socket 实例
server = socket.socket()

# 绑定地址并开始监听
server.bind(('127.0.0.1',9696))
server.listen(5)

while True:
    # 等待客户端连接
    conn,addr = server.accept()
    while True:
        # 接收消息
        msg = conn.recv(1024)
        msg = msg.decode('utf-8')
        print(f'收到消息:{msg}')
        if msg == 'q':
            break
        # 发送消息
        send_msg = input('请发送的消息 :>>>>>').strip()
        if not send_msg: continue
        conn.send(send_msg.encode('utf-8'))
    # 关闭连接
    conn.close()

# 关闭服务器
server.close()

5.TCP协议的特点

  • 可靠性:TCP使用可靠的数据传输机制,确保数据按照正确的顺序到达目标,并进行错误检测和重传。
  • 面向连接:在数据传输之前,TCP在客户端和服务端之间建立一个连接,确保双方能够进行可靠的通信。
  • 流式传输:TCP将数据划分为逻辑上连续的字节流,并通过网络传输。不同于UDP,它没有消息边界。
  • 拥塞控制:TCP具有拥塞控制机制,通过动态调整数据传输速率来避免网络拥塞。
  • 双工通信:TCP支持同时进行双向通信,客户端和服务端可以在同一个连接上交换数据。
  • 有序性:TCP保证数据按照发送的顺序到达目标,不会乱序。
  • 头部开销:TCP头部包含一些控制信息,因此在传输的数据中会有一定的开销。

【一】web框架的本质

image-20240226155147981

  • Web框架是一种软件框架,用于简化Web应用程序的开发。
  • web框架本质上就是一个TCP的客户端跟服务端

浏览器访问页面 —> 访问制定的URL地址 —> 后端服务器

客户端(浏览器/应用程序) —> 请求服务器(web框架) —> 再从数据库里面查询数据

数据库返回数据—> 被服务端接受并处理 —> 反馈给客户端

常见的Web框架

  • Django:基于Python的高级Web框架,提供了强大的功能和开发工具,适用于构建复杂的Web应用(重点学习)。
  • Flask:同样是基于Python的轻量级Web框架,灵活且易于学习,适用于快速开发小型Web应用或原型。
  • Ruby on Rails:基于Ruby语言的Web框架,遵循“约定优于配置”的原则,提高开发效率。
  • Express.js:基于Node.js的Web应用框架,简单易用,适合构建快速、高性能的服务器端应用。
  • Spring Framework:Java平台上最流行的开发框架之一,提供了全面的基础设施支持,包括依赖注入、AOP等。

web框架的特点

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
conn,addr = sk.accept()
from_b_msg = conn.recv(1024)
str_msg = from_b_msg.decode('utf-8')
#socket是应用层和传输层之间的抽象层,每次都有协议,协议就是消息格式,那么传输层的消息格式我们不用管,因为socket帮我们搞定了,但是应用层的协议还是需要咱们自己遵守的,所以再给浏览器发送消息的时候,如果没有按照应用层的消息格式来写,那么你返回给浏览器的信息,浏览器是没法识别的。而应用层的协议就是我们的HTTP协议,所以我们按照HTTP协议规定的消息格式来给浏览器返回消息就没有问题了,关于HTTP我们会细说,首先看一下直接写conn.send(b'hello')的效果,然后运行代码,通过浏览器来访问一下,然后再看这一句conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')的效果
#下面这句就是按照http协议来写的
# conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')
#上面这句还可以分成下面两句来写
conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
conn.send(b'hello')
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
conn,addr = sk.accept()
from_b_msg = conn.recv(1024)
str_msg = from_b_msg.decode('utf-8')
#socket是应用层和传输层之间的抽象层,每次都有协议,协议就是消息格式,那么传输层的消息格式我们不用管,因为socket帮我们搞定了,但是应用层的协议还是需要咱们自己遵守的,所以再给浏览器发送消息的时候,如果没有按照应用层的消息格式来写,那么你返回给浏览器的信息,浏览器是没法识别的。而应用层的协议就是我们的HTTP协议,所以我们按照HTTP协议规定的消息格式来给浏览器返回消息就没有问题了,关于HTTP我们会细说,首先看一下直接写conn.send(b'hello')的效果,然后运行代码,通过浏览器来访问一下,然后再看这一句conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')的效果
#下面这句就是按照http协议来写的
# conn.send(b'HTTP/1.1 200 ok \r\n\r\nhello')
#上面这句还可以分成下面两句来写
conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
conn.send(b'hello')

【1.0】

#  客户端
import socket

while True:
    client = socket.socket()
    # 创建连接
    client.connect(('127.0.0.1',9696))
    # 发送消息
    send_msg = input('请输入消息 :>>>>>').strip()
    if not send_msg: continue
    client.send(send_msg.encode('utf-8'))
    if send_msg == 'q':
        client.close()
        break
    # 接受消息
    msg = client.recv(1024)
    print(msg.decode('utf-8'))
# 服务端
import socket

server = socket.socket()

server.bind(('127.0.0.1',9696))

server.listen(5)


while True:
    conn,addr = server.accept()
    # 先接受
    msg = conn.recv(1024)
    msg = msg.decode('utf-8')
    print(f'msg:>>>{msg}')
    if msg == 'q':
        conn.close()
        break
    # 在发送
    while True:
        send_msg = input('请发送的消息 :>>>>>').strip()
        if not send_msg: continue
        conn.send(send_msg.encode('utf-8'))
        break

server.close()

【2.0】

  • 使用浏览器来充当客户端
  • 服务端无法正常响应客户端(浏览器)的请求

浏览器和服务端进行交互是基于HTTP协议

【1】什么是HTML

​ HTML是一个超文本语言,是一种创建网页结构的标记语言。就是你女朋友化妆之后的样子

【2】什么是HTTP协议

是一种用于在Web上传输数据的协议。它是客户端和服务器之间进行相互通信的基础的协议

【3】HTTP的特点

  • 无连接:每个http请求都是独立的

  • 无状态:不会保存客户端之间的信息,每个请求的是独立的

  • 超文本:可以传输除了文本之外的数据

  • 简单:HTTP使用简单的请求-响应模型,易于理解和实现。

  • 可扩展性:HTTP支持添加新的方法和头部字段,以满足不断变化的需求。

【4】请求数据格式

请求方式 请求路径(地址)状态码 版本(HTTP1.0)

响应头

响应体

【5】状态码

  • 20X(20开头):代表成功的状态码,指示请求已成功被服务器接收、理解和接受。
  • 30X(30开头):代表重定向的状态码,指示客户端需要执行进一步的操作来完成请求。
  • 40X(40开头):代表客户端错误的状态码,指示客户端发送了无效、无法处理或未经授权的请求。
  • 50X(50开头):代表服务器错误的状态码,指示服务器在处理请求时遇到了错误或无法完成请求。

【二】web框架代码版

·

# 客户端
# 【1】导入模块
import socket

# 【2】定义通信IP和端口
IP = '127.0.0.1'
PORT = 8686

# 【3】创建scock连接对象
client = socket.socket()
client.connect((IP, PORT, ))


while True:
    # 【4】发送数据
    client.send(b'hello laji server!')
    # 【5】接收数据
    data = client.recv(1024)
    print(f'这是来自客户端的信息:>>>>>>{data.decode("utf-8")}')
# 服务端
import socket
from _socket import SOL_SOCKET,SO_REUSEADDR

# 【2】定义通信IP和端口
IP = '127.0.0.1'
PORT = 8686

# 【3】创建scock连接对象
'''AF_INET 表示IPv4地址 ;SOCK_STREAM 表示使用TCP协议进行数据传输;'''
server = socket.socket()
'''setsockopt 套接字; SO_REUSEADDR 用于允许重用本地地址端口号'''
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 【4】监听端口
server.bind((IP,PORT))

# 【5】创建半链接池
server.listen(5)

while True:
    conn, addr = server.accept()

    # 从客户端接收到信息
    data_from_client = conn.recv(1024)
    data_from_client = data_from_client.decode("utf-8")

    # 从上述请求数据中切分出指定的请求方式和请求路径
    option = data_from_client.split(' ')
    # 请求方式
    option_type = option[0]
    # 请求路径
    option_path = option[1]
    print(option_path)
    http_res_type = "HTTP1.1 200 OK\r\n\r\n"
    # 根据请求路径指定请求方法
    if option_path == "/login":
        res = f"{http_res_type} hello dream login success"
        conn.send(res.encode("utf-8"))
    elif option_path == "/register":
        res = f"{http_res_type} hello dream register success"
        conn.send(res.encode("utf-8"))
    else:
        res = f"{http_res_type} 404 not found"
        conn.send(res.encode("utf-8"))

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

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

相关文章

go库x/text缺陷报告CVE-2022-32149的处理方案

#问题描述 go库 golang.org/x/text ,注意这里不是go的源码, 在0.3.8版本之前存在一个缺陷(Vulnerability) 缺陷ID CVE-2022-32149 具体描述 攻击者可以通过制作一个Accept-Language报头来导致拒绝服务。 具体的原因是,在解析这个Accept-L…

Vue 如何快速上手

目录 1. Vue 是什么 (概念) 1.1. Vue 的两种使用方式 1.2. 优点 1.3. 缺点 2. 创建 Vue 实例,初始化渲染 2.1. 步骤(核心步骤 4步) 2.2. 练习——创建一个Vue实例 3. 插值表达式 {{ }} 3.1. 介绍 3.2. 作用…

【Linux实验室】NFS、DHCP的搭建

NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS?环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录,配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…

python相对路径导包与绝对路径导包的正确方式

【python相对路径导包与绝对路径导包的正确方式】 python相对路径导包与绝对路径导包的正确方式_哔哩哔哩_bilibilipython导包的难题,今天解决了,相对路径导包和绝对路径导包,均可以!!!, 视频播放量 5、弹…

golang 归并回源策略

前言 下面是我根据业务需求画了一个架构图,没有特别之处,很普通,都是我们常见的中间件,都是一些幂等性GET 请求。有一个地方很有意思,从service 分别有10000 qps 请求到Redis,并且它们的key 是一样的。这样…

GDPU 竞赛技能实践 天码行空6

📖 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工…

数据库管理工具 DBeaverUE for Mac激活版

DBeaverUE for Mac是一款功能强大且易于使用的数据库管理工具,专为Mac用户设计。它支持多种数据库类型,如MySQL、PostgreSQL、Oracle等,使得用户可以轻松管理和操作各种数据库。 软件下载:DBeaverUE for Mac激活版下载 DBeaverUE …

GrayLog日志平台的基本使用-接入jumpserver

1、jumpserver3.8.0部署 Docker 环境准备 # 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 替换Docker 安装源为清华大学镜像站 sed -i sh…

《pytorch深度学习实战》学习笔记第2章

第2章 预训练网络 讨论3种常用的预训练模型: 1、根据内容对图像进行标记(识别) 2、从真实图像中生成新图像(GAN) 3、使用正确的英语句子来描述图像内容(自然语言) 2.1 获取一个预训练好的网络…

el-upload上传图片图片、el-load默认图片重新上传、el-upload初始化图片、el-upload编辑时回显图片

问题 我用el-upload上传图片,再上一篇文章已经解决了,el-upload上传图片给SpringBoot后端,但是又发现了新的问题,果然bug是一个个的冒出来的。新的问题是el-upload编辑时回显图片的保存。 问题描述:回显图片需要将默认的 file-lis…

A53 cache的架构解读

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 引流关键词:缓存,高速缓存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、…

精准扶贫管理系统|基于Springboot的精准扶贫管理系统设计与实现(源码+数据库+文档)

精准扶贫管理系统目录 目录 基于Springboot的精准扶贫管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1)用户信息管理 (2)贫困户信息管理 (3)新闻类型管理 &a…

【Java EE】关于Maven

文章目录 🎍什么是Maven🌴为什么要学Maven🌲创建⼀个Maven项目🌳Maven核心功能🌸项目构建🌸依赖管理 🍀Maven Help插件🎄Maven 仓库🌸本地仓库🌸私服 ⭕总结 …

Unity类银河恶魔城学习记录12-3 p125 Limit Inventory Slots源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Inventory.cs using Newtonsoft.Json.Linq; using System.Collections; us…

Linux 线程:线程互斥、互斥量、可重入与线程安全

目录 一、线程互斥 1、回顾相关概念 2、抢票场景分析代码 多个线程同时操作全局变量 产生原因 如何解决 二、互斥量 1、概念 2、初始化互斥量: 方法1:静态分配 方法2:动态分配 3、销毁互斥量: 4、加锁和解锁 示例抢…

多忽悠几次AI全招了!Anthropic警告:长上下文成越狱突破口,GPT羊驼Claude无一幸免

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 大模型厂商在上下文长度上卷的不可开交之际,一项最新研究泼来了一盆冷水—— Cl…

计算机网络-HTTP相关知识-HTTP的发展

HTTP/1.1 特点: 简单:HTTP/1.1的报文格式包括头部和主体,头部信息是键值对的形式,使得其易于理解和使用。灵活和易于扩展:HTTP/1.1的请求方法、URL、状态码、头字段等都可以自定义和扩展,使得其具有很高的…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收,主要注重基本底层原理讲解,进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构,内存结构可以分为:协程缓存、中央缓存…

Redis的高可用(主从复制、哨兵模式、集群)的概述及部署

目录 一、Redis主从复制 1、Redis的主从复制的概念 2、Redis主从复制的作用 ①数据冗余: ②故障恢复: ③负载均衡: ④高可用基石: 3、Redis主从复制的流程 4、Redis主从复制的搭建 4.1、配置环境以及安装包 4.2所有主机…

chabot项目介绍

项目介绍 整体的目录如下所示: 上述的项目结构中出了model是必须的外,其他的都可以根据训练的代码参数传入进行调整,有些不需要一定存在data train.pkl:对原始训练语料进行tokenize之后的文件,存储一个list对象,list的每条数据表…