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传输可靠的原因:有反馈机制,发消息之后对方必须回复确认收到消息,才会将数据从内存中清空,否则在限定的时间内会每隔一段时间发一次,直到对方接收或超时
洪水攻击:服务器在同一时间接收到了大量的请求
四次挥手 断开链接
因为第二次挥手与第三次挥手之间服务端还需要检测,做处理,故不能合并为一次挥手
python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01的更多相关文章
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协议的套接字 ...
- 01网络编程(基础知识+OSI七层协议+TCP与UDP)
目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...
- 1、网络并发编程--简介、软件开发架构、OSI七层协议
python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...
- 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议
Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...
- 软件开发架构与网络之OSI七层协议(五层)
本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...
- 网络编程、OSI七层协议
目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...
- Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)
Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: ...
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- 网络编程网络协议篇(osi七层协议)
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
随机推荐
- [spring cloud] [error] java.lang.IllegalStateException: Only one connection receive subscriber allowed.
前言 最近在开发api-gateway的时候遇到了一个问题,网上能够找到的解决方案也很少,之后由公司的大佬解决了这个问题.写下这篇文章记录一下解决方案.希望可以帮助到更多的人. 环境 java版本:8 ...
- kali随便写 kali更新源配置
./ +文件目录 是执行文件的意思 kali修改更新源及更新 进入源文件进行修改 leafpad /etc/apt/sources.list (其实系统本身就自带了更新源,去掉其注释也是可以的,现在 ...
- js上传图片获取原始宽高
以vue上传图片为例: <template> <div> <input type="file" @change="uploadFile($e ...
- JS基础_变量提升和函数提升
1.在函数中,不使用var声明的变量都会变为全局变量 function fun(){ d=10; //window.d=10; }; console.log(10);//10 2.定义形参就相当于在函 ...
- Java-JVM 类加载机制
类的生命周期中的第一步,就是要被 JVM 加载进内存,类加载器就是来干这件事. 一.类加载器种类 系统提供了 3 种类加载器: 1.启动类加载器(Bootstrap ClassLoader) 由 C ...
- JScript 程序流程控制
Jscript 脚本中的语句一般是按照写的顺序来运行的.这种运行称为顺序运行,是程序流的默认方向. 与顺序运行不同,另一种运行将程序流转换到脚本的另外的部分.也就是,不按顺序运行下一条语句,而是运行另 ...
- 一、初识Spring Boot框架
一.搭建Spring Boot环境 1.选择Project,选择Spring Initializr 2.选择Sdk与默认url 3.点击 Next 4.修改一下Group信息和Artifacet,Ne ...
- Service-stack.redis 使用PooledRedisClientManager 速度慢的原因之一
现在越来越多的开发者使用service-stack.redis 来进行redis的访问,但是获取redisclient的方式有多种方式,其中有一种从缓冲池获取client的方式很是得到大家的认可. L ...
- 解决 ElementTree 无法处理中文
解决 ElementTree 无法处理中文,UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 76-99: o ...
- django在进行模板render(渲染)时,对传过来的是字典中包含字典应用方法
网上自强学堂参考的 views.py def home(request): info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'} return r ...