zoukankan      html  css  js  c++  java
  • 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()










  • 相关阅读:
    Nhibernate 在一个项目中连接不同的数据库。记录
    sql2005 向2000导入数据。一些注意事项
    iis发布系统问题总结 .....关于handler的重写的应用
    ExecutorService 线程池
    Spring Boot 访问静态资源
    spring boot的核心注解
    日期处理工具类
    Json解析工具类
    (技能篇)Mysql在linux下的全量热备份
    Linux相关命令
  • 原文地址:https://www.cnblogs.com/onda/p/7055289.html
Copyright © 2011-2022 走看看