### 8.9 tcp协议和udp协议
#### 8.9.1 tcp协议 -------打电话
特点:
- 可靠 慢 全双工通信
- 建立连接的时候:三次握手
- 断开连接的时候:四次挥手
- 长连接:会一直占用双方的端口
- 能够传递的数据长度几乎没有限制
在建立连接之后:
- 发送的每一条信息都有回执
- 为了保证数据的完整,还有重传机制
IO(input,output)操作,输入和输出的相对内存来说的
- write send ------ output
- read recv ----- input
#### 8.9.2 udp协议 ------发短信
特点:
- 无连接的 速度快
- 可能会丢消息
- 能够传递的数据长度是有限的,是根据数据传递设备的设置有关系
### 8.9.3 应用场景
TCP:文件的上传下载(发送邮件、网盘、缓存电影)
UDP:即时通信(qq、微信、飞秋)
### 8.9.4 osi七层模型
七层模型:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
五层协议:
- 应用层 python代码
- 传输层 tcp/udp协议 端口
- 网络层 ipv4/ipv6协议
- 数据链路层 mac地址、arp协议
- 物理层
#### 8.9.5 socket(套接字)
socket:
- 同一台机器的两个服务之间的通信
- 基于网络的多台机器之间的多个服务通信
计算器:
```python
import re
from functools import reduce
def exp_format(exp):
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('++','+')
exp = exp.replace('-+','-')
return exp
def mul_div(atom_exp): # 最基础的两个数的加减乘除
if '*' in atom_exp:
a, b = atom_exp.split('*')
res = float(a) * float(b)
else:
a, b = atom_exp.split('/')
res = float(a) / float(b)
return res
def cal_muldiv(exp): # 匹配乘除法 计算
com = re.compile('\d+(\.\d+)?[*/]-?\d+(\.\d+)?')
while True:
obj = com.search(exp)
if obj:
atom_exp = obj.group()
res = mul_div(atom_exp)
exp = exp.replace(atom_exp,str(res))
else:break
return exp
def cal_addsub(exp): # 计算加减法
ret = re.findall('[-+]?\d+(?:\.\d+)?',exp)
count = reduce(lambda x,y:float(x)+float(y),ret)
return count
# 算式的去空格
exp = '2- -3* -4/ -5*-3 -6'
exp = exp.replace(' ','')
sub_exp = cal_muldiv(exp)
sub_exp = exp_format(sub_exp)
ret = cal_addsub(sub_exp)
print(ret)
```