Time模块补充知识
date和datetime区别是什么?
date 就是年月日
datetime就是年月时时分秒
以下代码为什么会报错?
import json
from datetime import datetime,date
print(datetime.today())
print(date.today())
"""
TypeError: Object of type 'datetime' is not JSON serializable
"""
因为datetime 和 data所传出的类型并不是json默认能处理的 不能被json序列化
原理json 处理数据类型用的类是JSONEcoder 你不往dumps里面传cls的类 他就默认用JSONEcoder
JSONEcoder这个类的方法default 定义了他不能序列化时返回的内容
可以自己写一个类去继承JSONEcoder,并重写其中的default方法
class MyJson(json.JSONEncoder):
def default(self, o):
if isinstance(o,datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o,date):
return o.strftime('%Y-%m-%d')
else:
return super().default(self,o)
res = {'c1':datetime.today(),'c2':date.today()}
print(json.dumps(res,cls=MyJson))
# {"c1": "2019-08-06 20:38:50", "c2": "2019-08-06"}
重写过的default方法不仅能使json处理datetime.todat()和date.today()
还能控制指定输出的形式
网络编程
软件开发架构
c/s架构(client/server)
c: 客户端
s: 服务器
b/s架构(browser/server)
b: 浏览器
s: 服务器
ps:b/s架构本质也是c/s架构
手机端看上去c/s架构( 即客户端装在手机上 )比较火,实际上b/s( 即手机端的APP相当于一个浏览器,服务都在网页上 )已经在崛起。
微信支付宝都在做一件事:统一接口
可以预见的是,手机端之后肯定也是b/s比较火。
服务端和客户端的特点?
服务端:24小时不间断提供服务
客户端:什么时候想体验服务,就去找相应的服务端去请求服务
学习网络编程的用处,以及开发一个b/s架构的软件需要什么?
学习网络编程 就可以开发一个c/s架构的软件
并发,数据库,前端,Django 就可以开发一个b/s架构的软件
网络编程的发展史
任何先进的技术最早都来源于军事
回到过去
- 早期的电话 电话线
- 大屁股电脑 网线
- 笔记本电脑 无线电话
要想实现远程第一个需要的是:物理连接介质
人要想实现无障碍交流必须说统一的语言
>>> 英文
计算机与计算机之间要想实现远程通信除了有物理连接介质之外还需要
>>> 一套公共的标准/协议
Osi 七层协议
应表会传网数物
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
Osi五层协议
应用层
传输层
网络层
数据链路层
物理连接层
1. 物理连接层
基于电信号传输010101二进制数据
2. 数据链路层
a. 规定了电信号的分组方式
b. 任何一台接入互联网的计算机都必须有一块网卡
每一块网卡都刻有世界上独一无二的编号
12位16进制数
前6位厂商编号
后6位流水线编号
这12位数叫mac地址
ps: 以上a,b两点合称为“以太网协议”
交换机
基于以太网协议通信
不能跨局域网通信
3. 网络层
IP协议
规定了只要是接入互联网的计算机都必须有一个IP地址
ip地址特点:点分十进制
ip地址最小:0.0.0.0
ip地址最大:255.255.255.255
ip地址目前有两个版本:IPV4
IPV6
(由于IPV4已经不够表示目前存在的计算机了所以推出了IPV6版本)
IP地址是动态分配的
4. 传输层
TCP\UDP都是基于端口工作的协议
端口(port)
计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信
端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000
端口号是动态分配的随机分配的
第一次起qq分配到的是8989
将qq关闭再次启动端口号可能就变了
总结
ip地址
:用来唯一标识接入互联网的一台计算机port端口
:用来唯一标识一台计算机上的某个应用程序ip+port
:唯一标识接入互联网一台计算机上的某个应用程序
5. 应用层
HTTP协议
FTP协议
TCP协议
流式协议,可靠协议
基于TCP协议通道
TCP协议传输数据之所以可靠,不是在于双通道,而是在于反馈机制,发送消息后必须等到对方回应,才会将内存中的数据清除。
UDP协议
数据报协议
无需建立双向通道 数据传输是不安全
将内存中的数据直接发送出去 不会做保留
早期的qq
三次握手四次挥手
三次握手建立连接
四次挥手断开连接
###如何解决TCP的粘包问题
基于TCP实现大文件的上传
客户端:
1.先生成一个字典
2.制作字典的报头
3.发送字典的报头
4.发送字典数据
5.发送真实数据
服务端
1.接收固定长度的报头
2.解析获取字典的长度
3.接收字典数据
4.解析获取真实数据信息
5.接收真实数据
socketserver
能够实现并发的效果
并发:看上去像同时运行的
并行:真正意义上的同时执行
ps:单核的计算机绝对不可能实现并行 但是可以实现并发
大文件上传
服务端
1.socket创建TCP服务
2.连接循环
3.通信循环
接受固定长度的字典的报头
解析获取字典数据的真实长度
接受字典数据 解码 反序列化成字典
从字典中获取文件大小 以及文件名等其他信息
4.循环接受文件数据
文件操作(wb) 接受一行往文件中写入一行
客户端
1.socket客户端代码
2.利用os.listdir获取文件夹中所有的文件名
3.循环打印 供用户选择想要上传的文件
用户选择是否符合要求
4.根据用户寻找及os.path.join方法拼接用户想要上传的文件绝对路径
5.根据文件路径获取文件大小os.path.getsize()
6.定义一个发送给服务端的字典
{
"file_name":用户选择的文件名,
"file_size":文件大小,
...额外键值对消息
}
7.制作字典的报头
序列化 编码
8.发送字典的报头
9.发送字典数据
10.发文件
文件操作 一行行读取并发送