学习内容

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()

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄