python之路——32
学习内容
1.应用层协议:http协议/https协议(网页)、ftp协议(文件传输)、smtp协议(邮件)
2.黏包问题
1.本质:无法确认发送的数据长度
2.TCP协议内部的优化算法
3.连续使用了多个send;多个recv
3.解决黏包问题
1.发送数据大小
2.合理接受数据
4.大文件的收发
1.发送大文件时,告诉接收方文件的大小
2.配置一个配置项,每次recv 的大小
3.文件传输过程中
1.按照字节读,每次读固定字节
2.一边读,一遍传
5.网络上传输的数据都叫 数据包
数据包里的所有数据都叫 报文
报文里有数据、ip地址、mac地址、端口号
所有报文都有 报头
协议规定
6.网络传输的过程当中,处处都有协议
协议就是一些报文和报头
协议是一种约定
代码区
1.黏包解决
# client import subprocess import socket sk = socket.socket() sk.connect(('127.0.0.1',8081)) while True: cmd = sk.recv(1024).decode('gbk') if cmd == 'q': break ret = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) std_out = ret.stdout.read() std_err = ret.stderr.read() num = str(len(std_out)+len(std_err)).encode('utf-8') sk.send(num) sk.recv(1024) sk.send(std_out) sk.send(std_err) sk.close() #server import socket sk = socket.socket() sk.bind(('127.0.0.1', 8081)) sk.listen() conn, addr = sk.accept() while True: cmd = input(">>> ") if cmd == 'q': conn.send(b'q') break conn.send(cmd.encode('gbk')) num = conn.recv(1024).decode('utf-8') conn.send(b'ok') res = conn.recv(int(num)).decode('gbk') print(res) conn.close() sk.close()
2.socket 解决黏包
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。#client import subprocess import socket import struct sk = socket.socket() sk.connect(('127.0.0.1',8080)) while True: cmd = sk.recv(1024).decode('gbk') if cmd == 'q': break ret = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) std_out = ret.stdout.read() std_err = ret.stderr.read() len_num = len(std_out)+len(std_err) num = struct.pack('i',len_num) sk.send(num) sk.send(std_out) sk.send(std_err) sk.close() # server import socket import struct sk = socket.socket() sk.bind(('127.0.0.1', 8080)) sk.listen() conn, addr = sk.accept() while True: cmd = input(">>> ") if cmd == 'q': conn.send(b'q') break conn.send(cmd.encode('gbk')) num = conn.recv(4) num = struct.unpack('i',num)[0] res = conn.recv(int(num)).decode('gbk') print(res) conn.close() sk.close()

更多精彩