### 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) ```