zoukankan      html  css  js  c++  java
  • python 学习_第三模块网络编程入门

     

    解决粘包情况

    客户端

    import socket,struct,sys,json
    
    # 系统平台
    def check_platfrom():
        if sys.platform == "win32":
            return "gbk"
        elif sys.platform == "linux2":
            return "utf-8"
    code = check_platfrom()
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ip_addr = ("127.0.0.1", 8000)
    phone.connect(ip_addr)
    
    while True:
        inp = input(">>>:   ").strip()
        if not inp:continue
        phone.send(inp.encode(code))
    
        # 1 收报头的长度
        head_data = phone.recv(4)
        header_size = struct.unpack("i",head_data)[0]
    
        # 2 再收报头
        header_json = phone.recv(header_size)
    
        # 3 从json文件解析文件
        header_file = json.loads(header_json)
        data_size = header_file["total_size"]
        print(header_file)
    
        recv_size = 0
        recv_data =b''
    
        # 4 接收真实的数据
        while recv_size < data_size:
            data = phone.recv(1024)  # 每次接收的数据
            recv_data +=data
            recv_size += len(data)
        print(recv_data.decode(code))
    
    phone.close()

    服务端

    import socket, struct,subprocess,sys,json
    
    
    # 系统平台
    def check_platfrom():
        if sys.platform == "win32":
            return "gbk"
        elif sys.platform == "linux2":
            return "utf-8"
    code = check_platfrom()
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ip_addr = ("127.0.0.1", 8000)
    phone.bind(ip_addr)
    phone.listen(5)
    
    while True:
        conn, client_addr = phone.accept()
        print(client_addr)
        while True:
            try:
                command = conn.recv(1024)
                if not command:break #适用于linux操作系统
                obj = subprocess.Popen(command.decode(code), shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
    
                stdout = obj.stdout.read()
                stderr = obj.stderr.read()
                total_size = len(stdout) + len(stderr)
    
                # 1制作报头
                head_dic = {"filename":"a.txt",
                            "md5":22222,
                            "total_size":total_size}
    
                header_json = json.dumps(head_dic)
                header_size = len(header_json)
    
                # 2发送 head_data
                conn.send(struct.pack('i',header_size))
    
                # 3发送 json_file
                conn.send(header_json.encode(code))
    
                # 4发送 命令的结果
                conn.send(stdout)
                conn.send(stderr)
                print(total_size)
            except ConnectionResetError:
                break
        conn.close()
    
    phone.close()
  • 相关阅读:
    东北育才 第1天
    东北育才 第0天
    BZOJ 3894 文理分科
    BZOJ 1001 [BeiJing2006]狼抓兔子
    POJ 2785 4 Values whose Sum is 0(暴力枚举的优化策略)
    UVA 1605 Building for UN(思维)
    统计频率(map映照容器的使用)
    POJ 1007 DNA Sorting(sort函数的使用)
    POJ 1002 487-3279(map映照容器的使用)
    BFS算法(——模板习题与总结)
  • 原文地址:https://www.cnblogs.com/augustyang/p/10763627.html
Copyright © 2011-2022 走看看