一.网络编程
1.网络编程三要素
ip地址、端口、TCP协议
ip地址
ip地址作用: 根据ip地址能够找到网络中的具体设备(电脑,打印机)
ip地址概念: ip地址是网络设备的唯一标识
ip地址分类: ipv4 和 ipv6(号称世界上每一粒沙子都能分配到ipv6地址)
ipv6用八个四位十六进制数表示地址, 一个四位十六进制数可以表示65536个十进制数, ipv6地址一共有65535的8次方个, 即3.40*10的38次方个.
查看网络状态: ping ip地址/域名
域名: 可以理解成ip地址的别名
查看本机ip地址: win->ipconfig mac->ifconfig
常用本机地址: localhost->127.0.0.1
端口(数据传输的通道)
端口号作用: 根据端口号能够找到网络设备上的程序端口
端口作用: 根据端口能够找到网络设备上的具体某个程序
端口号概念: 用于区分和管理端口的编号
端口概念: 端口是数据传输的通道(数据的必经之路)
端口号范围: 0-65535
端口号个数: 65536个
知名端口号: 0-1023
动态端口号: 1024-65535
协议(规定了数据传输的规则)
TCP协议: 传输控制协议
TCP协议特点: 面向连接,可靠,基于字节流传输
TCP面向连接步骤: 建立连接,传输数据,关闭连接
TCP可靠性: 发送应答机制,超时重传,错误校验,流量控制和阻塞管理
2.socket套接字
socket单词: 中文意思是插座
socket套接字: 网络多个进程中数据传输的工具(网上传送输入输出的装置)
进程概念: 运行中的程序
3.网络通信流程
1.根据ip地址找到网络设备(电脑,打印机)
2.根据端口号找到对应端口
3.根据端口找到对应程序
4.端口传输需要遵循协议规则
5.socket把数据从一个进程传送到另一个进程中
4.tcp开发服务器
TCP服务器开发固定7步:
1.创建socket服务器对象
2.绑定服务器信息(ip地址和端口号)
3.设置监听
4.等待客户端连接,直到连接成功为止
5.接收数据
6.发送数据
7.关闭socket服务器对象8.设置端口复用(若出现端口不能重复使用, 就设置端口复用)
注: 先运行前7步, 若出现第8步的情况再设置第8步, 第8步在第2步绑定服务器地址和端口号前设置.
# 1. 创建socket服务器对象(买手机) import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议 # 8.设置端口复用(如果出现端口不能重复使用,就设置端口复用) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号) server_addr = ('', 8081) server.bind(server_addr) # 参数是服务器地址 # 3. 设置监听(开机) server.listen(128) # 参数是最大连接数 # 4. 等着客户端连接,直到接通为止(等着接电话) new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息 print(f'{client_addr}客户端已连接') # 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据 client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据 print(f'客户端发来数据:{client_data.decode("gbk")}') # 二进制->字符串: decode(编码格式) # 6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据 new_server.send('我是服务器binzi'.encode("gbk")) # 字符串->二进制: encode(编码格式) # 7. 关闭socket服务器对象(挂电话) new_server.close() server.close()
二.web服务器
1.http协议
http协议作用: 规定了浏览器和web服务器之间的通信格式
html概念: 超文本标记语言
http协议概念: 超文本传输协议
注意: http协议是基于TCP协议的(传输数据需要面向连接)
2.URL
URL(Uniform Resoure Locator): 统一资源定位符
举例->url: http://www.itheima.com/index.com?name=binzi&pwd=123456
协议部分: http://
域名部分: www.itheima.com
资源路径部分: /index.com
查询参数部分[可选]: ?name=binzi&pwd=123456
get方式: 有查询参数部分, 查询参数是在资源路径的?后拼接
post方式: 没有查询参数部分, 查询参数是放到了请求体里
3.开发者模式
如何进入开发者模式?
Windows和Linux平台按F12调出开发者工具
mac OS选择 视图 -> 开发者 -> 开发者工具或者直接使用 alt+command+i 这个快捷键
还有一个多平台通用的操作就是在网页右击选择检查。
开发者工具的标签选项说明:
元素(Elements) :用于查看或修改HTML标签
控制台(Console):执行js代码
源代码(Sources):查看静态资源文件,断点调试JS代码
网络(Network) :查看http协议的通信过程开发者工具的Headers选项总共有三部分组成:
General: 主要信息
Response Headers: 响应头
Request Headers: 请求头
Response选项是查看响应体信息的
4,请求报文
请求报文: 请求方式不同,对应的报文结构不同
注意:每行末位默认有一个\r\n
get方式请求报文: 请求行 请求头 请求空行
post方式请求报文: 请求行 请求头 请求空行 请求体
5.响应报文
响应报文: 响应行 响应头 响应空行 响应体
具体响应格式:
响应行: HTTP/1.1 200 OK
响应头: Server: binzi
响应空行: \r\n
响应体: 页面注意:每行末位默认有一个\r\n
常见状态码:
2xx: 访问成功 常见的是200
3xx: 重定向 常见的是301
4xx: 客户端错误 常见的是404
5xx: 服务器错误 常见的是500
6.web服务器返回一句话
# 1. 创建socket服务器对象(买手机)
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议
# 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号)
server_addr = ('', 8084)
server.bind(server_addr) # 参数是服务器地址
# 3. 设置监听(开机)
server.listen(128) # 参数是最大连接数
# 4. 等着客户端连接,直到接通为止(等着接电话)
new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息
print(f'{client_addr}客户端已连接')
# 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据
client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据
print(f'{client_data}')
# [转换成响应报文]6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据
res_line = 'HTTP/1.1 200 ol\r\n'
res_head = 'Server: binzi\r\n'
res_null = '\r\n'
res_body = '我是服务器~'
res_all = res_line + res_head + res_null + res_body
new_server.send(res_all.encode('gbk')) # 字符串->二进制: encode(编码格式)
# 7. 关闭socket服务器对象(挂电话)
new_server.close()
server.close()
7.web服务器返回一个页面
# 1. 创建socket服务器对象(买手机)
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议
# 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号)
server_addr = ('', 8084)
server.bind(server_addr) # 参数是服务器地址
# 3. 设置监听(开机)
server.listen(128) # 参数是最大连接数
# 4. 等着客户端连接,直到接通为止(等着接电话)
new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息
print(f'{client_addr}客户端已连接')
# 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据
client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据
print(f'{client_data}')
# [转换成响应报文]6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据
res_line = 'HTTP/1.1 200 ol\r\n'
res_head = 'Server: binzi\r\n'
res_null = '\r\n'
# with open方式自动关闭文件对象
with open('index.html','rb') as f:
res_body = f.read() # 读出来是二进制
res_all = res_line + res_head + res_null
new_server.send(res_all.encode() + res_body) # 字符串->二进制: encode(编码格式)
# 7. 关闭socket服务器对象(挂电话)
new_server.close()
server.close()
三.fastapi框架
FastAPI简介: 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
FastAPI 框架关键特性: 高性能,易于学习,高效编码,生产可用
uvicorn: 异步服务器,用于配合fastapi框架一起 快速 搭建web服务器
安装
命令1: pip install fastapi
命令2: pip install uvicor
跳转页面
# 1.导包(注意: 自己创建的文件名不要叫fastapi)
from fastapi import FastAPI
from fastapi import Response
import uvicorn
# 2.创建fastapi对象
app = FastAPI()
# 3.fastapi处理web数据
# 访问url: http://127.0.0.1:8086/index.html
@app.get('/index.html') # 参数是资源路径
def show():
with open('index.html', 'rb') as f:
res_body = f.read() # 注意:读出来已经是二进制
return Response(res_body)
# 4.启动服务器
uvicorn.run(app, host='127.0.0.1', port=8086)
加载图片
# fastapi: 快速,高效,高性能,生产可用的最快python版本web框架
# 1.导包
from fastapi import FastAPI
from fastapi import Response
import uvicorn
# 2.创建对象
api = FastAPI()
# 3.处理web数据 举例: 网址url: http://127.0.0.1:8081/
@api.get('/') # 自动跳转首页
def show():
with open('index.html', 'rb') as f:
res_body = f.read()
return Response(res_body)
# 注意: 如果跳转的页面包含图片,浏览器会自动发送请求:http://127.0.0.1:8081/picture.jpg
@api.get('/picture.jpg') # 自动加载图片
def show():
# 自动跳转首页
with open('picture.jpg', 'rb') as f:
res_body = f.read()
return Response(res_body)
# 4.启动服务器
uvicorn.run(api, host='127.0.0.1', port=8081)
加载视频
# fastapi: 快速, 高效, 高性能, 生产可用的最快的python版本web框架
# 1.导包
from fastapi import FastAPI, Response
import uvicorn
# 2.创建对象
app = FastAPI()
# 3.处理web数据
@app.get('/') # 参数可以理解成是url的资源路径部分
def show():
with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\index.html', 'rb') as fp:
res_body = fp.read()
res = Response(res_body)
return res
@app.get('/iu_03.jpg') # 参数可以理解成是url的资源路径部分
def show():
with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\iu_03.jpg', 'rb') as fp:
res_body = fp.read()
res = Response(res_body)
return res
@app.get('/HD.mp4') # 参数可以理解成是url的资源路径部分
def show():
with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\HD.mp4', 'rb') as fp:
res_body = fp.read()
res = Response(res_body)
return res
# 4.启动服务器
uvicorn.run(app, host='127.0.0.1', port=9092)
注: 要实现图片, 视频加载的功能, 需要在html文件中有相应的请求