面向对象补充知识点(面向对象的应用)

扩展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传输可靠的原因:有反馈机制,发消息之后对方必须回复确认收到消息,才会将数据从内存中清空,否则在限定的时间内会每隔一段时间发一次,直到对方接收或超时

洪水攻击:服务器在同一时间接收到了大量的请求

四次挥手 断开链接

因为第二次挥手与第三次挥手之间服务端还需要检测,做处理,故不能合并为一次挥手

python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01的更多相关文章

  1. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程    1.OSI七层协议    2.基于tcp协议的套接字通信    3.模拟ssh远程执行命令    4.tcp的粘包问题及解决方案    5.基于udp协议的套接字 ...

  2. 01网络编程(基础知识+OSI七层协议+TCP与UDP)

    目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...

  3. 1、网络并发编程--简介、软件开发架构、OSI七层协议

    python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...

  4. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  5. 软件开发架构与网络之OSI七层协议(五层)

    本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...

  6. 网络编程、OSI七层协议

    目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...

  7. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  8. 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)

    目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...

  9. 网络编程网络协议篇(osi七层协议)

    一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...

随机推荐

  1. <context:component-scan>标签报错解决方案

  2. vscode 插件推荐 - 献给所有前端工程师(2018.4.29更新)

    大家好,我是Moer.VScode现在已经越来越完善.性能远超Atom和webstorm,你有什么理由不用它?在这里,我会给你们推荐很多实用的插件,让你对 vscode 有更深刻的体会,渐渐地你就会知 ...

  3. android data binding jetpack II 动态数据更新

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  4. ajax-php跨域请求

    php: function __construct(){ // 指定允许其他域名访问 header("Access-Control-Allow-Origin: *"); heade ...

  5. IDEA内存设置

    之前,博主的idea一直运行正常,今天,开发了一个接口,因为接口在项目中另一个模块,之前从来没有启动过这个模块,由于调试接口将该模块也放到tomcat容器中,结果我的idea不停崩溃,于是查看idea ...

  6. yum源问题

    配置本地yum源 1.使用工具将iso文件上传到操作系统,或者直接挂载iso文件 2.配置yum #cd /etc/yum.repos.d/ 删除多余的repo文件 # vi /etc/yum.rep ...

  7. 设计模式--观察者模式--python

    观察者模式: 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 主要解决: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面.将这二者封装在 ...

  8. 转发:Java对象及其引用

    原文: http://zwmf.iteye.com/blog/1738574 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知 ...

  9. openerp学习笔记 视图中字段只变化(on_change)联动其他字段值、选择和过滤

    1.修改产品数量时,自动计算产品销售金额.销售成本和销售利润<field name="num" on_change="on_change_product(produ ...

  10. Card 卡片

    将信息聚合在卡片容器中展示. 基础用法 包含标题,内容和操作. Card 组件包括header和body部分,header部分需要有显式具名 slot 分发,同时也是可选的. <el-card ...