解决粘包问题-终极单版本

我的未来我决定 提交于 2019-11-28 09:53:42

服务端:

#!/usr/bin/env python# -*- coding: utf-8 -*-import socketimport subprocessimport structimport jsonphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)    # 端口复用phone.bind(('127.0.0.1', 8090))phone.listen(10)while True: # 连接循环    connt , client = phone.accept()    print('starting ....')    print(client)    while True: # 通信循环        try:            # 1.收到命令:            cmd = connt.recv(1024)            if not cmd :continue   # 适用于Linux 操作系统            # 2.执行命令:            ojb = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)            stdout = ojb.stdout.read()            stderr = ojb.stderr.read()            # 3.返回命令结果给客户端:            # 第一步先制作报头            header_dic = {                'filename':'aaa.txt',                'md5':'adv88889992',                'total_size': len(stderr+stdout)            }            # 第二步 序列号header_dic            header_json = json.dumps(header_dic)            header_bytes = header_json.encode('utf-8')            # 第三步 先发送包头的长度            res = len(header_bytes)            connt.send(struct.pack('i', res))            # 第四步 再发送报头            connt.send(header_bytes)            # 第五步再发送真实数据            connt.send(stdout)            connt.send(stderr)        except ConnectionResetError:       # 适用于windows操作系统            break    connt.close()phone.close()

 

 

客户端:

 

#!/usr/bin/env python# -*- coding: utf-8 -*-import socketimport structimport jsonphone1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone1.connect(('127.0.0.1',8090))while True:    # 1.发命令    cmd = input('>>>:').strip()    if not cmd:continue    phone1.send(cmd.encode('utf-8'))    # 2.拿到命令并打印结果    # 第一步先收报头长度    obj=phone1.recv(4)    # 第二步从包头中解析出对真实数据的描述信息    header_size=struct.unpack('i',obj)[0]    # 第三步接收报头    header_bytes= phone1.recv(header_size)    # 第 四步反序列化:    header_json = header_bytes.decode('utf-8')    header_dic = json.loads(header_json)    total_size = header_dic['total_size']    # 第五步 接收真实数据    recv_size = 0    data_size = b''    while recv_size < total_size:        data =phone1.recv(1024)        data_size += data        recv_size += len(data)    print(data_size.decode('gbk'))     # windows 默认编码是gbk linux 默认编码是 utf-8phone1.close()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!