zoukankan      html  css  js  c++  java
  • 解决粘包问题终极版

    服务端:

    import socket
    import subprocess
    import struct
    import json
    #买手机
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    #print(phone)
    #绑定手
    server.bind(('192.168.0.102', 8080))
    server.listen(5)
    while True:
    conn, cent = server.accept()
    while True:
    try:
    cmd = conn.recv(1024)
    obj = subprocess.Popen(cmd.decode('utf-8'), shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    stdout = obj.stdout.read()
    stderr = obj.stderr.read()
    # 第一步制作固定长度报头
    header_dic = {'md5':'ssssss',
    'filename':'a.txt',
    'total_saze':len(stdout)+len(stderr)}
    head_json = json.dumps(header_dic)
    head_bytes = head_json.encode('utf-8')
    #第二部发送报头长度
    conn.send(struct.pack('i', len(head_bytes)))

    # total_saze = len(stdout)+len(stderr)
    # header = struct.pack('i', total_saze)
    #第三步发送报头
    conn.send(head_bytes)
    #第四步发送真是数据
    conn.send(stdout+stderr)

    except ConnectionResetError:
    break
    conn.close()
    server.close()





    客户端:
    import socket
    import struct
    import json
    #买手机
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #拨号
    client.connect(('192.168.0.102', 8080))
    while True:
    cmd = input('请输入你的指令>>>')
    client.send(cmd.encode('utf-8'))

    # 第一步接收报头长度
    obj = client.recv(4)
    head_saze = struct.unpack('i', obj)[0]
    #header = client.recv(4)
    #第二步再收报头
    head_bytes = client.recv(head_saze)
    # 第三步从报头中解释出报头包含的所有信息
    head_json = head_bytes.decode('utf-8')
    head_dic = json.loads(head_json)
    print(head_dic)


    total_saze = head_dic['total_saze']
    print(total_saze)
    # 第四步接收真实数据
    recv_save = 0
    data_recv = b''
    while recv_save < total_saze:
    res = client.recv(1024)
    data_recv+=res
    recv_save+=len(res)
    #data = client.recv(1024)
    print(len(data_recv.decode('GBK')),' ',data_recv.decode('GBK'))
    client.close()
  • 相关阅读:
    web中的安全编码
    网站安全(学习)
    head 命令(转)
    less 命令(转)
    简单网站优化
    Yahoo团队总结的关于网站性能优化的经验(转)
    more命令(转)
    linux安装oracle
    Ubuntu系统环境变量配置文件(转)
    nl命令(转)
  • 原文地址:https://www.cnblogs.com/yuexijun/p/11480099.html
Copyright © 2011-2022 走看看