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

    服务端:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import socket
    import subprocess
    import struct
    import json

    phone = 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 socket
    import struct
    import json

    phone1 = 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-8

    phone1.close()
  • 相关阅读:
    SQLServer三种自定义函数
    IE下必须点击一下页面空白的地方才可以激活onchange事件
    1234跨年总结(2014年总结)
    半透明背景(兼容IE)
    EF Power Tools
    ASP.NET MVC报错: Multiple types were found that match the controller named
    URI、URL和URN
    SQLServer中临时表与表变量的区别分析
    C#分部方法
    __flash__removeCallback 未定义错误
  • 原文地址:https://www.cnblogs.com/kingforn/p/11403817.html
Copyright © 2011-2022 走看看