复习之网络编程

'''
学习网络编程 ---开发c/s架构的软件
学习并发编程,前端,数据库,框架 ---开发b/s架构的软件
'''
'''
七层协议:应表会传网数物
应用层:http/ftp

传输层:tcp,udp
计算机之间的通信是某一个具体的应用程序与另外一个应用程序之间的通信
端口port:唯一标识一台计算机某一个基于网络通信的应用程序 标识的就是应用程序
tcp面向流的协议,udp面向消息的协议
是基于端口工作的,端口范围是0-65535
默认端口MySQL 3306
flask5000
django框架8000
redis数据库默认6379

tcp:三次握手四次挥手
三次握手就是建立连接的过程,客户端向服务端发送请求,服务端回复的时候附上自己的请求,最后客户端回复请求,连接建立
四次挥手是断开连接的过程客户端向服务端发送断开请求,服务端断开请求并回复,然后自己向客户端发送断开的请求,客户端回应断开的请求
--中间服务端不直接回回复的原因是万一自己还有任务没有发送,想起来再次发送,所以断开请求时4次
洪水攻击:服务端大量处于建立连接的状态,来不及处理客户端的消息
星轨:扛得住明星出轨的流量访问次数,就是接收请求的软件很牛逼,多少个客户来都可以承受,就是自己高并发很牛逼
udp 传输数据时候可能会出现丢包现象,但是传输速度快
网络层:ip协议
1.规定了每一台接入互联网的计算机都有唯一的IP地址
2.ip地址特点:点分十进制
IPv4,ipv6
0.0.0.0-255.255.255.255
3.ip协议可以实现跨局域网传输

数据链路层:以太网协议
1.规定了二进制数据的分组方式
2.规定了只要是接入互联网的计算机都必须有一块网卡
每一块网卡出厂都会被烧制上一个世界上唯一的一个mac地址
mac地址是由12位16进制数组成,前6位代表厂商地址,后6位代表的是流水线号
物理连接层:实现计算机之间的物理连接,传输的数据都是0101的二进制。
电信号的工作原理是:电只有高低电频,01代表的就是高低电频

小总结:ip唯一标识一台接入互联网的计算机
port 唯一标识一台计算机上面的某一个应用程序
ip+port 唯一标识一台接入互联网的计算机上面的应用程序
mac地址:规定了接入互联网的计算机都必须有一块网卡,通常由16位12进制组成,前6位是厂商编号,后6位是流水线号



学习完了网络编程基础,就来学习socket套接字,通过这个,我们可以实现基本的网络通信,最后可以自己实现一个c/s软件的开发
了解socket套接字:是处于应用层额和网络层之间的一个抽象的概念,目的就是将下面的硬件通过socket套接字应用与软件上
分为客户端和服务端,导入模块socket,方法accept,recv,send,bind,connect,listen
建立通信,建立连接
通信循环:通信一次结束不好,最好多来几次,所以来个循环
不能只和一个人建立连接,所以得多个连接,来个循环 弊端:一次只可以服务一个人,但是服务端是可以服务多个人的,所以
最好将通信和建立连接分开,各自干各自的活


异常处理:基于tcp实现通信的话,因为tcp是面向流的协议,所以如果输入为空就会报错,所以要进行异常处理


tcp处理问题会出现粘包的问题,所以针对粘包的处理有下面的几个问题
发送端:发送报头,发送字典长度 ,发送真实内容
接收端:接收报头,接收字典长度,解析字典, 收取真实数据
练习:tcp实现大文件上传socket,struct,json
struct 打包成固定长度

tcp和udp的区别
tcp:类似打电话,接不到就会一直呼叫,所以会是一个安全的
udp类似发短信,不管有没有收到都不管

'''
'''
并发编程
操作系统的发展史
多道技术:空间上的复用(多个程序公用一套硬件设备,是多道计数实现时间上的复用的基础)
时间上的复用(单个CPU的电脑上启用多个程序,CPU快速切换)
cpu切换:
一个任务占用时间过长/遇到io操作
并发:看起来像是同时运行的就是并发
并行:同一时刻同时运行的就是并行


进程:一个任务就是一个进程,占用内存空间,资源单位
线程:CPU的执行单位
协程:人为提出的可以实现单个协程执行任务不切换,具体操作就是gevent.spwan,自动监测io行为,所有的监测的话导入猴子monky



进程内容:
1.创建进程的两种方式multiprocess.Process
继承类Process
定义方法然后target=任务名

2.join方法:就是让主线程等待子线程结束,将主进程和子进程变成串行,但是子线程还是并发
3.进程对象的其他方法:查看pid,每一个进程都有一个唯一的pid,current_process().pid==porcess().pid/os.getpid()
terminate()主动杀死子进程的操作
is_alive判断子进程是否存活状态
demarn=True 守护进程(子进程守护主进程),必须再子进程启动之前守护
4.互斥锁:保证数据的安全mutex.acquire/release 模拟抢票
5.进程间的通信ipc机制 queue put get get_nowait full empty

生产者消费者模型
生产者:产生数据
消费者:处理数据
解决供需不平衡的问题

进程池:current.future 为了计算机的寿命考虑,自己定义一个进程池固定一次执行多少的任务
current.future pool=Processpoolexature pool.submit(是一个future对象) future.result
回调函数 ---让别的去执行任务
线程内容:
和进程的区别是进程只是开辟了内存空间,并不是一个具体的执行单位,如果要执行的话就得将代码复制一份到内存,就会很耗时间
所以CPU并不执行进程,执行的都是线程
形象理解车间和流水线
进程是车间:提供资源 资源单位
线程是流水线:是CPU最小的执行单位


1.创建线程的两种方式 threading.thread
1.自定义一个类,继承Thread
2.定义方法然后target=任务名

2.线程的join 主线程等待子线程结束
3.守护线程:子线程监测主线程,定时发送消息告诉你主线程的近况,一旦主线程死掉,子线程就不再发送消息,也可以认为此时子线程也死了
但是主线要等到所有的子线程都结束才可以结束
4.线程对象的其他方法 查看线程名

GIL全局解释器锁 与普通锁的区别 死锁 递归锁 信号量(多把锁) event事件一个线程给另一个线程发消息
线程间通信queue 但是线程间信息是共享的

线程池:CPU执行的是线程,不能无限制的开线程,为了节省计算机寿命
current.future pool=threadpoolexature pool.submit(future对象) future.result
回调函数


协程:人为想出来的为了让单个线程下的多个任务不间断执行,实现并发(切换+保存状态)
gevent.spwan spwan是一个拥有返回值的 spawn.join让所有的线程都结束
posted @ 2019-05-12 18:24  mcc61  阅读(130)  评论(0编辑  收藏  举报