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七层协议)
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
随机推荐
- Vue_(组件)实例方法
Vue.js实例方法/生命周期 传送门 常用的实例方法 数据: 传送门 vm.$set:设置属性值 vm.$delete:删除属性值 vm.$watch:观测数据变化 生命周期 vm.$mount:手 ...
- [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP
题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...
- org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found.
1. 情景重现 1.1 Mapper 代码 public interface DeviceFileInfoVOMapper { List<QueryFileDTO> selectVideo ...
- CentOS7——卡在在启动界面
系统在启动时,卡在启动界面比如: 解决方法一 这个时候其实系统已经启动了,如果这台机器之前正确配置好了网络连接的话,此时我们可以使用另外一台机器通过SSH来登录这台机器进行修改. 这个时候将系统出问题 ...
- 统计网络time_wait连接状态及tcpip连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' LAST_ACK 1 SYN_RECV 14 ESTABLIS ...
- RN性能优化(重新探索react吧)
最近做RN遇到了一些性能瓶颈,逼着自己不得不做一些优化 已经做过,或者尝试过得优化方案: 1.点击效果防止重复点击. 2.左右两边分别用两个异步栈进行更新,这样能让右边的缓慢不影响左边的更新. 3.I ...
- kubernetes学习:CKA考试认证
考点 CKA认证针对考核成为当业界的Kubernetes管理员所需的技能. CKA认证考试包括这些一般领域及其在考试中的权重: 应用程序生命周期管理 - 8% 安装.配置和验证 - 12% 核心概 ...
- Using NodeLists
Understanding a NodeList object and its relatives, NamedNodeMap and HTMLCollection, is critical to a ...
- Python-数据库连表查询、子查询
连表查询 [实例]通过例子来熟悉连表查询的概念 # 第一步:建表 # 建立英雄职业分类表格 create table classification( id int, name varchar(20) ...
- read: Connection reset by peer
造成此种问题的原因有多种,目前列下我所遇到过的. 1, sshfs usrname@172.23.65.122:/home/usrname ./122 在ubunutu 里面使用 sshfs 命令 映 ...