doraemon的python tcp协议和udp协议

### 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)
```
原文地址:https://www.cnblogs.com/doraemon548542/p/11345201.html