• python_day8 socket 网络编程解决 粘包问题 -->struct


    解决思路:

    先将要发送的数据 进行    len()  得出一个  字节数(比源文件字节数小很多倍),做成一个包头

    然后如果 这个包头也很巨大的话,就再加一层

    将包头的这个数字放在字典里面,

    将字典 作为 包头的包头先传递过去

    接受者 进行解包,先收到 包头的包头, 从里面 拿到 包头的 大小

    再接受 包头,再拿到 真是包的大小,最后收取

    其中可以通过struct  转成byets格式

    服务端

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    #make in LA
    import json
    import socket
    import struct
    import subprocess
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    server.bind(('127.0.0.1',80))
    server.listen(5)
    while True:
    conn,address=server.accept()
    while True:
    head_dic={}
    try:
    data=conn.recv(1024)
    if not data:break
    print(data)
    res=subprocess.Popen(data.decode('utf-8'),shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
    err=res.stderr.read()
    if err:
    msg=err
    else:
    msg=res.stdout.read()
    #做包头
    head_dic['size']=len(msg)
    head_json=json.dumps(head_dic).encode('utf-8')


    conn.send(struct.pack('i',len(head_json)))
    conn.send(head_json)
    conn.sendall(msg)
    except Exception:
    break
    conn.close()
    server.close()







    客户端
     #!/usr/bin/python
    # -*- coding:utf-8 -*-
    #make in LA
    import json
    import socket
    import struct
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('127.0.0.1',80))

    while True:
    inp=input('cmd>>:').strip()
    if not inp:continue
    client.send(inp.encode('utf-8'))
    head=client.recv(4)
    sex=struct.unpack('i',head)[0]

    head_dic=client.recv(sex)

    head_dic=head_dic.decode('utf-8')
    # print(head_dic)
    head_JG=json.loads(head_dic)
    # print(head_JG['size'])
    haed_sex=head_JG['size']
    #
    JG=''
    while haed_sex > 1024:
    data=client.recv(1024).decode('gbk')
    haed_sex-=1024
    JG+=data
    data=client.recv(haed_sex).decode('gbk')
    JG+=data
    print(JG)

    client.close()










  • 相关阅读:
    8) linux安装samba服务器
    7) k8s获取apiversion下面的对应可用资源
    4) cobbler自动安装linux
    3) KVM命令--使用篇(1)
    2) 各种开源环境自动部署脚本
    1) nginx编译安装
    扁平式小清新导航
    互联网公司常用水平导航(二级导航)
    水平导航-三级导航-切换流畅
    简约蓝色系导航(三级导航)
  • 原文地址:https://www.cnblogs.com/onda/p/7055289.html
Copyright © 2020-2023  润新知