zoukankan      html  css  js  c++  java
  • 粘包解决模板

    """
    @作者: egon老湿
    @微信:18611453110
    @专栏: https://zhuanlan.zhihu.com/c_1189883314197168128
    """
    import struct
    import json
    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8083))
    
    while True:
        cmd=input('请输入命令>>:').strip()
        if len(cmd) == 0:continue
        client.send(cmd.encode('utf-8'))
    
        # 接收端
        # 1、先手4个字节,从中提取接下来要收的头的长度
        x=client.recv(4)
        header_len=struct.unpack('i',x)[0]
    
        # 2、接收头,并解析
        json_str_bytes=client.recv(header_len)
        json_str=json_str_bytes.decode('utf-8')
        header_dic=json.loads(json_str)
        print(header_dic)
        total_size=header_dic["total_size"]
    
        # 3、接收真实的数据
        recv_size = 0
        while recv_size < total_size:
            recv_data=client.recv(1024)
            recv_size+=len(recv_data)
            print(recv_data.decode('utf-8'),end='')
        else:
            print()
    """
    @作者: egon老湿
    @微信:18611453110
    @专栏: https://zhuanlan.zhihu.com/c_1189883314197168128
    """
    # 服务端应该满足两个特点:
    # 1、一直对外提供服务
    # 2、并发地服务多个客户端
    import subprocess
    import struct
    import json
    from socket import *
    
    server=socket(AF_INET,SOCK_STREAM)
    server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
    server.bind(('127.0.0.1',8083))
    server.listen(5)
    
    #  服务端应该做两件事
    # 第一件事:循环地从板连接池中取出链接请求与其建立双向链接,拿到链接对象
    while True:
        conn,client_addr=server.accept()
    
        # 第二件事:拿到链接对象,与其进行通信循环
        while True:
            try:
                cmd=conn.recv(1024)
                if len(cmd) == 0:break
                obj=subprocess.Popen(cmd.decode('utf-8'),
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE
                                 )
    
                stdout_res=obj.stdout.read()
                stderr_res=obj.stderr.read()
                total_size=len(stdout_res)+len(stderr_res)
    
                # 1、制作头
                header_dic={
                    "filename":"a.txt",
                    "total_size":total_size,
                    "md5":"123123xi12ix12"
                }
    
                json_str = json.dumps(header_dic)
                json_str_bytes = json_str.encode('utf-8')
    
    
                # 2、先把头的长度发过去
                x=struct.pack('i',len(json_str_bytes))
                conn.send(x)
    
                # 3、发头信息
                conn.send(json_str_bytes)
                # 4、再发真实的数据
                conn.send(stdout_res)
                conn.send(stderr_res)
    
            except Exception:
                break
        conn.close()
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/bk134/p/12747599.html
Copyright © 2011-2022 走看看