zoukankan      html  css  js  c++  java
  • Python入门学习-DAY32-链接循环与通信循环,粘包问题,远程控制,文件上传与下载

    链接循环与通信循环

    服务端

    from socket import *
    
    IP = '127.0.0.1'
    PORT = 8181
    ADDRESS = (IP, PORT)
    BUFFSIZE = 1024
    
    server = socket(AF_INET, SOCK_STREAM)
    
    server.bind(ADDRESS)
    
    server.listen(5)
    tag=True
    while tag:
        conn, addr = server.accept()
        while tag:
            try:
                data = conn.recv(BUFFSIZE)
                if not data:
                    print('客户端断开。。。')
                    break
                print('>>>>',data.decode('utf-8'))
                conn.send('收到'.encode('utf-8'))
            except ConnectionResetError:
                break
        conn.close()
    server.close()

    客户端

    import  socket
    IP='127.0.0.1'
    PORT=8181
    ADDRESS=(IP,PORT)
    BUFFSIZE=1024
    
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    client.connect(ADDRESS)
    while True:
    
        msg=input('>>>')
        if len(msg) == 0: continue
        client.send(msg.encode('utf-8'))
        data=client.recv(BUFFSIZE)
    
        print(data.decode('utf-8'))
    
    client.close()

    远程控制

    服务端

    import socket
    import subprocess
    IP = '192.168.13.126'
    PORT = 8282
    ADDRESS = (IP, PORT)
    BUFFSIZE = 1024
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    server.bind(ADDRESS)
    
    server.listen(5)
    tag=True
    while tag:
        conn, addr = server.accept()
        while tag:
            try:
                data = conn.recv(BUFFSIZE)
                if not data:
                    print('客户端断开。。。')
                    break
                #获取sub对象
                res = subprocess.Popen(data.decode("utf-8"),
                                       shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                print('>>>>',data.decode('utf-8'))
                stdout=res.stdout.read()
                stderr=res.stderr.read()
    
                conn.send(stdout+stderr)
            except ConnectionResetError:
                break
        conn.close()
    server.close()

    客户端

    import  socket
    IP='127.0.0.1'
    PORT=8282
    ADDRESS=(IP,PORT)
    BUFFSIZE=1024
    
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    client.connect(ADDRESS)
    while True:
    
        msg=input('>>>')
        if len(msg) == 0: continue
        client.send(msg.encode('utf-8'))
        data=client.recv(BUFFSIZE)
    
        print(data.decode('gbk'))
    
    client.close()

    粘包问题

    服务端

    import socket
    import subprocess
    import struct
    import json
    
    IP = '127.0.0.1'
    PORT = 8383
    ADDRESS = (IP, PORT)
    BUFFSIZE = 1024
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    server.bind(ADDRESS)
    
    server.listen(5)
    tag = True
    while tag:
        conn, addr = server.accept()
        while tag:
            try:
                data = conn.recv(BUFFSIZE)
                if not data:
                    print('客户端断开。。。。')
                    break
                # 获取sub对象
                res = subprocess.Popen(data.decode("utf-8"),
                                       shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                print('>>>>', data.decode('utf-8'))
                # 成功的结果
                stdout = res.stdout.read()
                # 失败的结果
                stderr = res.stderr.read()
    
                # 1.制作报头
                header_dic = {
                    'filename': 'a.txt',
                    'md5': 'sd7a86d87sad6as',
                    'total_size': len(stdout) + len(stderr)
                }
                header_json = json.dumps(header_dic)
                header_bytes = header_json.encode('utf-8')
    
                # 2.先发送报头长度
                conn.send(struct.pack('i', len(header_bytes)))
    
                # 3.再发送报头
                conn.send(header_bytes)
    
                # 4.最后发送数据
                conn.send(stdout)
                conn.send(stderr)
            except ConnectionResetError:
                break
        conn.close()
    server.close()

    客户端

    import socket
    import struct
    import json
    IP = '127.0.0.1'
    PORT = 8383
    ADDRESS = (IP, PORT)
    BUFFSIZE = 1024
    
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    client.connect(ADDRESS)
    while True:
    
        msg = input('>>>')
        if len(msg) == 0: continue
        client.send(msg.encode('utf-8'))
    
        # 1.先获取报头长度
        header_size = struct.unpack('i',client.recv(4))[0]
    
        #2.在获取报头
        header_bytes=client.recv(header_size)
        header_json=header_bytes.decode('utf-8')
        header_dic=json.loads(header_json)
        print(header_json)
        total_size=header_dic['total_size']
    
        # 3.在获取真正数据
        cmd_res=b''
        recv_size=0
        while recv_size<total_size:
            data=client.recv(BUFFSIZE)
            recv_size+=len(data)
            cmd_res+=data
        print(cmd_res.decode('gbk'))
    
    client.close()

    文件上传与下载

    common

    import json, struct, os
    
    
    def accept(type, obj):
        res = obj.recv(1).decode('utf-8')
        if res == '1':
            # 1.先获取报头长度
            header_size = struct.unpack('i', obj.recv(4))[0]
            # 2.在获取报头
            header_bytes = obj.recv(header_size)  # 接受字节型的报头
            header_json = header_bytes.decode('utf-8')  # 将字节型的报头转化为原先的JSON格式
            header_dic = json.loads(header_json)  # 将JSON格式的报头转化为原先的字典
            total_size = header_dic['total_size']
            print(header_dic)
            # 3.在获取真正数据# 设置存放文件的路径
            if type == 'server':
                file_path = os.path.join(r'C:UsersAdministratorDesktop服务端文件中心\%s' % header_dic['filename'])
            elif type == 'client':
                file_path = os.path.join(r'C:UsersAdministratorDesktop客户端文件中心\%s' % header_dic['filename'])
            # 判断文件内容是否为空
            if total_size != 0:
           recv_size=0
           file_res=b''
    while (recv_size < total_size): data = obj.recv(10240) recv_size += len(data)
              file_res+=data with open(file_path,
    'wb') as f: f.write(file_res) else: f = open(file_path, 'wb') f.close() return True else: return False def transfer(obj, filename): if os.path.exists(filename): obj.send('1'.encode('utf-8')) filepath, tempfilename = os.path.split(filename) # 1.制作报头 header_dic = { 'filename': tempfilename, 'total_size': os.stat(filename).st_size } header_json = json.dumps(header_dic)#将字典格式序列化为json方便传送 header_bytes = header_json.encode('utf-8')#只能传送bytes类型,所以要转化为bytes类型 print(header_dic) # 2.先发送报头长度 obj.send(struct.pack('i', len(header_bytes))) # 3.再发送报头 obj.send(header_bytes) # 4.最后发送数据 with open(filename, 'rb') as f: for i in f: obj.send(i) return True else: obj.send('0'.encode('utf-8')) return False

    服务端

    import socket
    import common
    
    
    def run():
        IP = '127.0.0.1'
        PORT = 8484
        ADDRESS = (IP, PORT)
        BUFFSIZE = 1024
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind(ADDRESS)
        server.listen(5)
        tag = True
        while tag:
            conn, addr = server.accept()
            while tag:
                try:
                    data = conn.recv(BUFFSIZE)
                    if not data:
                        print("客户端已断开。。。")
                        break
                    cmd, filename = data.decode("utf-8").split( )
                    print('>>>>', data.decode('utf-8'))
                    if cmd=='1':
                        flag=common.accept('server',conn)
                        if flag:
                            print('接受成功')
                        else:
                            print('接受失败')
                    elif cmd=='2':
                        flag=common.transfer(conn, filename)
                        if flag:
                            print('传送成功')
                        else:
                            print('传送失败')
                except ConnectionResetError:
                    break
            conn.close()
        server.close()
    
    
    run()

    客户端

    import socket
    import common
    
    
    def run():
        IP = '127.0.0.1'
        PORT = 8484
        ADDRESS = (IP, PORT)
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(ADDRESS)
        print('''
        1.上传
        2.下载
                ''')
        while True:
            msg = input('>>>(1/2):')
            if len(msg) == 0: continue
            if msg!='1' and msg!='2':
                print('指令错误')
                continue
            filename=input('文件地址:')
            client.send((msg+' '+filename).encode('utf-8'))
            if msg == '1':
                flag=common.transfer(client, filename)
                if flag:
                    print('上传成功')
                else:
                    print('上传失败')
            elif msg == '2':
                flag=common.accept('client',client)
                if flag:
                    print('下载成功')
                else:
                    print('下载失败')
    
        client.close()
    
    
    
    run()
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9580067.html
Copyright © 2011-2022 走看看