python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01
面向对象补充知识点(面向对象的应用)
扩展json序列化所支持的数据类型(分析源码)
import json
from datetime import datetime, date
# --------------------------------------------------
# 时间序列化
# --------------------------------------------------
# 直接将带有时间格式数据的字典用json序列化,报错
# res = {'c1': datetime.today, 'c2': date.today} # 没加括号
# print(json.dumps(res)) # 报错 TypeError: Object of type 'builtin_function_or_method' is not JSON serializable
# res = {'c1': datetime.today(), 'c2': date.today()}
# print(json.dumps(res)) # 报错 TypeError: Object of type 'datetime' is not JSON serializable
# --------------------------------------------------
# 解决方案一
# --------------------------------------------------
# 直接把时间格式的数据转换成字符串,再json序列化
res = {'c1': str(datetime.today()), 'c2': str(date.today())} # 转成 str
print(json.dumps(res))
# {"c1": "2019-08-06 14:40:20.256285", "c2": "2019-08-06"}
# --------------------------------------------------
# 解决方案二
# --------------------------------------------------
# 根据 json.JSONEncoder 源码,给他扩展支持的数据类型
'''
To extend this to recognize other objects, subclass and implement a
``.default()`` method with another method that returns a serializable
object for ``o`` if possible, otherwise it should call the superclass
implementation (to raise ``TypeError``).
'''
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")
# -----------------------------------
# 自定义扩展其他类型 来让json支持
# 要传 cls=JSONEncoder 的地方应该都可以应用这个类 json.load...
# -----------------------------------
# elif isinstance(o, date):
# raise TypeError # 抛出异常
# elif isinstance(o, 要扩展的类型):
# return o.strftime("%Y-%m-%d") # 要做的处理,确认返回方式
else:
return super().default(self, o) # 调用父类的
res = {'c1': datetime.today(), 'c2': date.today()}
# print(json.dumps(res)) # 报错 TypeError: Object of type 'datetime' is not JSON serializable
print(json.dumps(res, cls=MyJson)) # 将自己扩展的作为传入参数 cls=MyJson 来支持时间类型序列化
# {"c1": "2019-08-06 14:52:08", "c2": "2019-08-06"}
res2 = {'a1': datetime.today(), 'a2': date.today()}
print(json.dumps(res, cls=MyJson)) # 后续要序列化含有时间类型的数据时 只需要传入这个参数就可以了
# {"c1": "2019-08-06 20:10:56", "c2": "2019-08-06"}
看看json.dumps()的源码(按住ctrl + 鼠标单击dumps)
看看JSONEncoder源码(按住ctrl + 鼠标单击JSONEncoder)
软件开发架构
c/s架构(客户端client/服务端server)
客户端
与服务器相对应,为客户提供本地服务的程序
服务端
能对其它机器提供某些服务的计算机系统
b/s架构(浏览器端browser/服务端server)
浏览器也是客户端,b/s架构本质也是c/s架构
在手机上看起来是c/s架构比较火,实际上b/s架构已经在崛起了
微信、支付宝都在统一接口(小程序平台),手机端以后肯定也是b/s比较火
- 用户无需因为特定功能就去下载一个app(省去了手机空间与下载步骤,有些功能可能只用一次)
- 下次使用功能时也无需再去打开该软件,不需要面对一堆应用软件,只需要找到并打开小程序即可
其实微信、支付宝做这些苦力活也可以保住自己的流量(互联网时代,流量十分重要)
网络编程发展史
ps:现在的大多先进的技术最早都来源于军事
历史上实现远程异地通信的方案
- 早期电话----电话
- 大屁股电脑----网线
- 早期手机----手机卡
- 笔记本电脑、无线电话----网卡
要想实现远程通信第一个要具备的条件是:物理连接介质
不同国籍的人要想实现无障碍交流就必须说统一的语言 >>> 例如英语
计算机与计算机之间要想实现远程通信除了有物理连接介质之外还需要有一套:公共的协议标准
实现远程通信的条件
-
物理连接介质
-
公共的协议标准
-
服务器及客户端程序
公共的协议标准(OSI七层协议)
各层对应的物理设备
各层对应的协议
应用层
与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的
HTTP协议、FTP协议
表示层
定义数据格式及加密
会话层
它定义了如何开始、控制和结束一个会话
传输层
TCP、UDP协议(都是基于端口工作的协议)
端口(port)
作用:用来唯一标识一台计算机上的某个应用程序
端口号范围:065535,01024都是操作系统默认使用的端口号,个人程序推荐使用8000之后的端口
常见软件的默认端口:
-
mysql 默认使用 3306
-
redis 默认端口 6379
-
django 默认端口 8000
-
flask 默认端口 5000
-
tomcat 默认端口 8080
计算机上的端口号是动态分配的,将一个程序关闭之后再次启动端口号可能就不一样了
IP 地址:可以唯一标识一台接入互联网的计算机(独一无二)
port 端口号:可以唯一标识一台计算机上的某个应用程序
故 IP + port 可以唯一标识接入互联网任意一台计算机上的唯一一个应用程序
计算机与计算机之间的通信其实是计算机上的应用程序与应用程序之间的通信
网络层
IP协议
规定了只要是接入互联网的计算机都必须有一个IP地址
IP地址的特点:点分十进制
IP地址范围:0.0.0.0~255.255.255.255
ipconfig可以查看本机的IP(电脑重启会重新分配)
IP地址目前有两个版本:IPV4、IPV6
由于IPV4已经不够表示目前的计算机了,所以推出了IPV6版本
那么为什么访问百度用的是 www.baidu.com 呢?
背后有一个“域名解析”技术,将 www.baidu.com 这个域名网址解析成了 ip 地址,然后找到了百度那台服务器上的资源(实质上还是IP)
数据链路层
物理连接层的数据不知道从哪里开始读,一次读几位
数据链路层作的规定
-
规定了电信号的分组方式
-
规定了任何一台接入互联网的计算机都必须有一块网卡
- 每一块网卡上都刻有世界上独一无二的编号(12位16进制数,前6位是厂商编号,后6位是流水线编号 ---> 这12位数是计算机的mac地址)
以上两点合称为“以太网协议”
基于以太网协议通信的特点:通信基本靠吼(广播,通知所有计算机)
几种连接方式
两台电脑网线直连
只能实现两台机器的链接(局域网),其实多一个网卡就可以与另外一个计算机相连,但那样计算机上就太多网卡口了不好
通过交换机连接多台计算机
多台计算机之间借助于交换机来实现互联(局域网)
通过路由器连接多台交换机再连通多台计算机
通过路由器来跨越局域网(互联网)
广播:主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要)
单播:主机收到信息原路返回
广播风暴:多次广播会造成(以太网协议的缺点)
arp协议:根据IP地址解析mac地址
物理连接层
基于电信号传输二进制数据(计算机是基于电信号工作的,电信号只有高低两种电频,用0和1表示,那表示数据也就是二进制数据)
简记口诀
应表会传网数物
-
应用层
-
表示层
-
会话层
-
传输层
-
网络层
-
数据链路层
-
物理连接层
TCP协议
流式协议,可靠协议
基于TCP协议通信,必须先建立双向通道(前提条件)
客户端与服务端在三次握手四次挥手中各阶段的状态
三次握手四次挥手
三次握手建立连接(双向通道)
原理:标志位后+1(syn = n --> ack = n + 1 请求过来n,返回n+1) 来区分客户端
第二次与第三次握手可以合并成一次(也就是为什么图上有4个箭头却说他是三次握手)
TCP传输可靠的错误说法:TCP协议传输数据之所有可靠原因就在于双向通道
TCP传输可靠的原因:有反馈机制,发消息之后对方必须回复确认收到消息,才会将数据从内存中清空,否则在限定的时间内会每隔一段时间发一次,直到对方接收或超时
洪水攻击:服务器在同一时间接收到了大量的请求
四次挥手 断开链接
因为第二次挥手与第三次挥手之间服务端还需要检测,做处理,故不能合并为一次挥手
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构