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

扩展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. AtCoder AGC032E Modulo Pairing (二分、贪心与结论)

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...

  2. python3爬取拉钩招聘数据

    使用python爬去拉钩数据 第一步:下载所需模块 requests 进入cmd命令 :pip install requests 回车 联网自动下载 xlwt 进入cmd命令 :pip install ...

  3. 分享代码到GitHub

    1.本地安装git 2.项目文件夹右键Git bash here,弹出git命令窗口 3.输入git init,使项目加入Git管理 4.输入git add .,将项目全部内容添加到git 5.输入“ ...

  4. linu逻辑分区动态调整大小

    注意: 这个动态调整的方法是有丢数据风险的,要确保调整的源分区没有使用或者使用率很低.源分区中如果有重要的文件最好先备份 在centos 6.5上操作过 lvdisplay 查看已有的分区的大小 lv ...

  5. war包的解压与打包

    转: war包的解压与打包 2018年03月22日 14:59:56 Jitwxs 阅读数:21421   版权声明:本文版权归Jitwxs所有,欢迎转载,但未经作者同意必须保留原文链接. https ...

  6. layui 常用确认框、提示框 demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. Selenium 2自动化测试实战27(unittest重要概念,test fixture、test case、test suite和test runne)

    一.unittest重要概念 4个重要概念:test fixture.test case.test suite和test runner. 1.Test Case一个TestCase的实例就是一个测试用 ...

  8. rsync服务安装使用

    ssh方式与daemon方式有什么大的区别吗?相对来说ssh比较简单易理解,是不是daemon安全性比较高呢? 区别是:ssh方式是通过ssh协议来传输,需要知道对方机器的用户名和密码. daemon ...

  9. 浅谈JS中 reduce() 的用法

    过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊JS中 reduce ...

  10. python-Web-django-邮箱登陆

    setting: # 发送邮箱 EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 465 EMAIL_HOST_USER = '666666@163.com' #EMA ...