zoukankan      html  css  js  c++  java
  • 作业二

    4月21号

    服务端
    
    import json, struct, os
    from socket import *
    
    
    class MyTcpServer:
    
        def __init__(self, ipport):
            self.ipport = ipport
            self.server = socket(AF_INET,SOCK_STREAM)
            try:
                self.server_bind()
                self.server_activate()
            except Exception:
                self.server_close()
    
        def server_bind(self):
            self.server.bind(self.ipport)
    
        def server_activate(self):
            self.server.listen(5)
    
        def server_head(self, filesize, status):
            head_dic = {'filesize': filesize, 'status': status}
            head_json = json.dumps(head_dic)
            head_json_bytes = head_json.encode('utf-8')
            head_struct = struct.pack('i', len(head_json_bytes))
            self.conn.send(head_struct)
            self.conn.send(head_json_bytes)
    
        def get_request(self):
            print('等待连接...')
            return self.server.accept()
    
        def server_close(self):
            self.server.close()
    
        def close_request(self, request):
            request.close()
    
        def run(self):
            while True:
                self.conn, self.client_addr = self.get_request()
                print('from client ', self.client_addr)
                while True:
                    try:
                        head_struct = self.conn.recv(4)
                        if not head_struct: break
                        head_len = struct.unpack('i', head_struct)[0]
                        head_json = self.conn.recv(head_len).decode('utf-8')
                        head_dic = json.loads(head_json)
                        print(head_dic)
                        cmd = head_dic['cmd']
                        if hasattr(self, cmd):
                            func = getattr(self, cmd)
                            func(head_dic)
                    except Exception:
                        break
    
        def get(self, args):
            file_path = os.path.normpath(os.path.join('test_tcp', args['filename']))
            if os.path.exists(file_path):
                filesize = os.path.getsize(file_path)
                self.server_head(filesize, True)
                with open(file_path, 'rb') as f:
                    for line in f:
                        self.conn.send(line)
            else:
                self.server_head(None, False)
    
        def put(self, args):
            file_path = os.path.normpath(os.path.join('test_tcp', args['filename']))
            filesize = args['filesize']
            recv_size = 0
            with open(file_path, 'wb') as f:
                while recv_size < filesize:
                    recv_data = self.conn.recv(4096)
                    f.write(recv_data)
                    recv_size += len(recv_data)
    
    
    server = MyTcpServer(('127.0.0.1',8080))
    server.run()
    
    
    ##并发
    import json, struct, os
    import socketserver
    
    class MyRequestHandle(socketserver.BaseRequestHandler):
        def handle(self):
            print(self.client_address)
            while True:
                try:
                    head_struct = self.request.recv(4)
                    if not head_struct: break
                    head_len = struct.unpack('i', head_struct)[0]
                    head_json = self.request.recv(head_len).decode('utf-8')
                    head_dic = json.loads(head_json)
                    print(head_dic)
                    cmd = head_dic['cmd']
                    if hasattr(self, cmd):
                        func = getattr(self, cmd)
                        func(head_dic)
                except Exception:
                    break
            self.request.close()
    
    
        def server_head(self, filesize, status):
            head_dic = {'filesize': filesize, 'status': status}
            head_json = json.dumps(head_dic)
            head_json_bytes = head_json.encode('utf-8')
            head_struct = struct.pack('i', len(head_json_bytes))
            self.request.send(head_struct)
            self.request.send(head_json_bytes)
    
    
        def get(self, args):
            file_path = os.path.normpath(os.path.join('test_tcp', args['filename']))
            if os.path.exists(file_path):
                filesize = os.path.getsize(file_path)
                self.server_head(filesize, True)
                with open(file_path, 'rb') as f:
                    for line in f:
                        self.request.send(line)
            else:
                self.server_head(None, False)
    
        def put(self, args):
            file_path = os.path.normpath(os.path.join('test_tcp', args['filename']))
            filesize = args['filesize']
            recv_size = 0
            with open(file_path, 'wb') as f:
                while recv_size < filesize:
                    recv_data = self.request.recv(4096)
                    f.write(recv_data)
                    recv_size += len(recv_data)
    
    
    s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyRequestHandle)
    print("等待连接...")
    s.serve_forever()
    
    
    客户端
    
    
    import json, struct, os
    from socket import *
    
    class MyTcpClient:
    
        def __init__(self, ipport):
            self.ipport = ipport
            self.client = socket(AF_INET, SOCK_STREAM)
            try:
                self.client_connect()
            except Exception:
                self.client_close()
    
        def client_connect(self):
            self.client.connect(self.ipport)
    
        def client_close(self):
            self.client.close()
    
    
        def download(self, total_size, recv_size):
            percent = recv_size / total_size
            res = int(50 * percent) * '#'
            print('
    [%-50s] %d%%' % (res, int(100 * percent)), end='')
    
    
        def run(self):
            while True:
                cmd = input("输入指令>>: ").strip()
                if not cmd: continue
                li = cmd.split()
                cmd = li[0]
                if hasattr(self, cmd):
                    func = getattr(self, cmd)
                    func(li)
    
    
        def get(self, args):
            cmd = args[0]
            filename = args[1]
            head_dic = {'cmd': cmd, 'filename': filename}
            print(head_dic)
            head_json = json.dumps(head_dic)
            head_json_bytes = head_json.encode('utf-8')
            head_struct = struct.pack('i', len(head_json_bytes))
            self.client.send(head_struct)
            self.client.send(head_json_bytes)
            rc_headstruct = self.client.recv(4)
            rc_len = struct.unpack('i', rc_headstruct)[0]
            rc_json = self.client.recv(rc_len).decode('utf-8')
            rc_dic = json.loads(rc_json)
            if rc_dic['status']:
                total_size = rc_dic['filesize']
                recv_size = 0
                with open(filename, 'ab') as f:
                    while recv_size < total_size:
                        recv_data = self.client.recv(1024)
                        recv_size += len(recv_data)
                        self.download(total_size, recv_size)
                        f.write(recv_data)
                print('
    文件下载成功')
            else:
                print("服务器没有此文件")
    
        def put(self, args):
            cmd = args[0]
            filename = args[1]
            if not os.path.isfile(filename):
                print('file:%s is not exists' % filename)
                return
            else:
                filesize = os.path.getsize(filename)
    
            head_dic = {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': filesize}
            print(head_dic)
            head_json = json.dumps(head_dic)
            head_json_bytes = bytes(head_json, encoding='utf-8')
            head_struct = struct.pack('i', len(head_json_bytes))
            self.client.send(head_struct)
            self.client.send(head_json_bytes)
            send_size = 0
            with open(filename, 'rb') as f:
                for line in f:
                    self.client.send(line)
                    send_size += len(line)
                    self.download(filesize, send_size)
                else:
                    print('
    upload successful')
    
    client = MyTcpClient(('127.0.0.1',8080))
    client.run()
    
    

    4月20号

    服务端
    
    import subprocess
    import struct
    from socket import *
    
    server=socket(AF_INET,SOCK_STREAM)
    server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 
    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)
                header=struct.pack('i',total_size)
                conn.send(header)
    
                conn.send(stdout_res)
                conn.send(stderr_res)
    
            except Exception:
                break
        conn.close()
    
    
    客户端
    
    import struct
    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'))
    
    
        header=client.recv(4)
        total_size=struct.unpack('i',header)[0]
    
    
        recv_size = 0
        while recv_size < total_size:
            recv_data=client.recv(1024)
            recv_size+=len(recv_data)
            print(recv_data.decode('gbk'),end='')
        else:
            print()
    
    

    4月15号

    # 1、在元类中控制把自定义类的数据属性都变成大写
    
    class Mymeta(type):
    
        def __new__(cls, name, bases, attrs):
            update_attrs = {}
            for k, v in attrs.items():
                if not callable(v) and not k.startswith('__'):
                    update_attrs[k.upper()] = v
                else:
                    update_attrs[k] = v
            return super().__new__(cls, name, bases, update_attrs)
    
    
    class Foo(metaclass=Mymeta):
        name = 'fyy'
        def walk(self):
            print(f'{self.name} walk')
    
    print(Foo.__dict__)
    
    
    
    # 2、在元类中控制自定义的类无需__init__方法
    
    class Mymeta(type):
        def __call__(self, *args, **kwargs):
            if args:
                raise TypeError('must use keyword argument for key function')
            obj = object.__new__(self)
    
            for k, v in kwargs.items():
                obj.__dict__[k.upper()] = v
            return obj
    
    class Foo(metaclass=Mymeta):
        name = 'fyy'
        def walk(self):
            print(f'{self.name} walk')
    
    p=Foo(name='lili',age=18,sex='male')
    print(p.__dict__)
    
    
    # 3、在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性
    
    class Mymeta(type):
    
        # def __init__(self, class_name, class_bases, class_dic):
        #     # 控制类Foo的创建
        #     super().__init__(class_name, class_bases, class_dic)
    
        def __call__(self, *args, **kwargs):
            obj = self.__new__(self)
            self.__init__(obj, *args, **kwargs)
            obj.__dict__ = {f'_{self.__name__}__{k}':v for k,v in obj.__dict__.items()}
            return obj
    
    class Foo(object, metaclass=Mymeta):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    obj = Foo('fyy', '19')
    print(obj.__dict__)
    
    
    # 4、基于元类实现单例模式
    class Mymeta(type):
        def __init__(self,name,bases,dic):
            self.__instance = object.__new__(self)
            self.__init__(self.__instance, '1.1.1.4',3307)
            super().__init__(name,bases,dic)
    
        def __call__(self, *args, **kwargs):
            if args or kwargs:
                obj=object.__new__(self)
                self.__init__(obj,*args,**kwargs)
                return obj
            return self.__instance
    
    class Mysql(metaclass=Mymeta):
        def __init__(self,host,port):
            self.host=host
            self.port=port
    
    obj1=Mysql()
    obj2=Mysql()
    print(obj1 is obj2 is obj2)
    obj4=Mysql('1.1.1.4',3307)
    
    

    4月10号
    https://gitee.com/FenYiYuan/python-newscs.git

    4月7号

    https://gitee.com/FenYiYuan/python-scs.git
    

    4月3号

    https://gitee.com/FenYiYuan/python.git
    

    3月31号

    # 作业:
    #     1、把登录与注册的密码都换成密文形式
    #     3、注册功能改用json实现
    import hashlib, json
    def login():
        name = input("用户名:")
        pwd = input("密码:")
        pwd = hashlib.md5(pwd.encode('utf-8')).hexdigest()[1:11]
        sh = hashlib.sha1((pwd + 'fyy').encode('utf-8')).hexdigest()[1:11]
        with open('user.txt', 'rt', encoding='utf-8') as f:
            for line in f:
                usermsg = json.loads(line)
                if usermsg.get("name") == name and sh == usermsg.get("password"):
                    print("登录成功")
                    return
            else:
                print('用户或密码错误')
                return
    def rigist():
        name = input("用户名:")
        pwd = input("密码:")
        pwd = hashlib.md5(pwd.encode('utf-8')).hexdigest()[1:11]
        sh = hashlib.sha1((pwd+'fyy').encode('utf-8')).hexdigest()[1:11]
        user = {"name":name, 'password':sh}
        with open('user.txt', 'at', encoding='utf-8') as f:
            json.dump(user, f)
            f.write('
    ')
    login()
    
    # 2、文件完整性校验(考虑大文件)
    import os, hashlib
    def foo(filepath):
        size = os.path.getsize(filepath)
        tmp = size // 6
        sum = b''
        with open(filepath, 'rb') as f:
            for i in range(6):
                f.seek(0*tmp)
                data = f.read(tmp//6)
                sum = sum + data
        return hashlib.md5(sum).hexdigest()
    
    print(foo(r'D:pycharmoldboy20200330a.txt'))
    
    
    # 4、项目的配置文件采用configparser进行解析
    '''
    config.ini
    [section1]
    username=egon
    is_admin=True
    pwd=31
    [section2]
    hobby=playgame
    salary=10000
    age=18
    sex='男'
    '''
    
    import configparser
    
    config=configparser.ConfigParser()
    config.read('conf.ini', encoding='utf-8')
    
    # 1、获取sections
    print(config.sections())
    
    # 2、获取某一section下的所有options
    print(config.options('section1'))
    
    # 3、获取items
    print(config.items('section1'))
    
    # 4、
    username=config.get('section1','username')
    
    is_admin=config.getboolean('section1','is_admin')
    
    salary=config.getfloat('section2','salary')
    
    

    3月30号

    今日作业:
    ##1、检索文件夹大小的程序,要求执行方式如下
            python3.8 run.py 文件夹
    import sys, os
    
    spath = sys.argv[1]
    sum = 0
    def sumfilesize(dirpath):
        global sum
        path = dirpath
        dirlist = os.listdir(path)
        for file in dirlist:
            res = os.path.join(path, file)
            if os.path.isfile(res):
                sum += os.path.getsize(res)
            else:
                sumfilesize(res)
        return sum
    
    print(sumfilesize(spath))
    
    
    ##2、明天上午日考:随机验证码、模拟下载以及打印进度条、文件copy脚本
    
    
    import  random
    def vrft_code(size=4):
        res = ''
        for i in range(size):
            s = chr(random.randint(65,90))
            s1 = chr(random.randint(97,122))
            n = str(random.randint(0,9))
            res += random.choice((s,n,s1))
        return res
    
    print(vrft_code())
    
    
    
    import time
    def download(total_size, recv_size=0):
        def progress(percent):
            if percent > 1:
                percent = 1
            res = int(50 * percent) * '#'
            print('
    [%-50s] %d%%' % (res, int(100 * percent)), end='')
    
        while recv_size < total_size:
            time.sleep(0.1)  # 下载了1024个字节的数据
            recv_size += 1000
            percent = recv_size / total_size
            progress(percent)
    
    download(20000)
    
    
    import sys
    src_file=sys.argv[1]
    dst_file=sys.argv[2]
    
    with open(r'%s' %src_file,mode='rb') as read_f,
        open(r'%s' %dst_file,mode='wb') as write_f:
        for line in read_f:
            write_f.write(line)
    
    
    

    3月26号

    # 作业:
    # 1、文件内容如下,标题为:姓名,性别,年纪,薪资
    #     egon male 18 3000
    #     alex male 38 30000
    #     wupeiqi female 28 20000
    #     yuanhao female 28 10000
    #
    # 要求:
    # 从文件中取出每一条记录放入列表中,
    # 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
    with open('a.txt','rt', encoding='utf-8') as f:
        info=[{
            'name': line.split()[0],
            'sex': line.split()[1],
            'age': int(line.split()[2]),
            'salary':int(line.split()[3])
        } for line in f]
    print(info)
    
    
    # 2 根据1得到的列表,取出薪资最高的人的信息
    print(max(info, key=lambda dic:dic.get('salary')))
    
    # 3 根据1得到的列表,取出最年轻的人的信息
    print(min(info, key=lambda dic:dic.get('age')))
    
    # 4、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写
    names=['egon','alex_sb','wupeiqi','yuanhao']
    print([name.upper() for name in names])
    print(list(map(lambda x:x.upper(), names)))
    
    # 5、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度
    print(list(filter(lambda name:not name.endswith('sb'), names)))
    print([name for name in names if not name.endswith('sb')])
    
    # 6、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)
    with open('a.txt', 'rt', encoding='utf-8') as f:
        # print(len(max(f, key=lambda x:len(x))))
        tmp = [len(line) for line in f]
    print(max(tmp))
    
    
    # 7、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)
    
    print(sum(tmp))
    
    # 8、思考题
    with open('a.txt') as f:
        g=(len(line) for line in f)
    print(sum(g)) #为何报错?
    g 是生成器
    
    # 9、文件shopping.txt内容如下
    # mac,20000,3
    # lenovo,3000,10
    # tesla,1000000,10
    # chicken,200,1
    # 求总共花了多少钱?
    with open('shopping.txt','rt', encoding='utf-8') as f:
        info=[line.split(',') for line in f]
        cost=sum(int(price)*int(count) for _, price, count in info)
        print(cost)
    
    # 打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]
    with open('shopping.txt','rt', encoding='utf-8') as f:
        info=[{
            'name': line[0],
            'price': int(line[1]),
            'count': int(line[2]),
        } for line in [i.split(',') for i in f]]
    print(info)
    
    # 求单价大于10000的商品信息,格式同上
    with open('shopping.txt','rt', encoding='utf-8') as f:
        info=[{
            'name': j[0],
            'price': int(j[1]),
            'count': int(j[2]),
        } for j in [i.split(',') for i in f] if int(j[1]) > 10000]
    print(info)
    
    # 10、思考:判断下述说法是否正确
    #     题目1:
    #     1、应该将程序所有功能都扔到一个模块中,然后通过导入模块的方式引用它们
            错误
    #     2、应该只将程序各部分组件共享的那一部分功能扔到一个模块中,然后通过导入模块的方式引用它们
            正确
    #
    #     题目2:
    #     运行python文件与导入python文件的区别是什么?
            一种被当程序执行,另一种被当模块导入,
    #     运行的python文件产生的名称空间何时回收,为什么?
            文件程序执行完回收名称空间
    #     导入的python文件产生的名称空间何时回收,为什么?
            当没有文件引用时,回收名称空间
    

    3月25号

    # 1、文件内容如下,标题为:姓名,性别,年纪,薪资
    # 要求:
    # 从文件中取出每一条记录放入列表中,
    # 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
    a.txt
    # egon male 18 3000
    # alex male 38 30000
    # wupeiqi female 28 20000
    # yuanhao female 28 10000
    
    with open('a.txt', 'rt', encoding='utf-8') as f:
        info = [
            {
                'name': line.split()[0], 'sex': line.split()[1], 'age': line.split()[2], 'salary': line.split()[3]
            } for line in f
        ]
    print(info)
    
    # 2 根据1得到的列表,取出所有人的薪资之和
    data = (dic.get('salary') for dic in info)
    print(sum(int(i) for i in data))
    print(sum(int(i) for i in [dic.get('salary') for dic in info]))
    
    # 3 根据1得到的列表,取出所有的男人的名字
    print([k.get('name') for k in info for v in k if k.get(v) == 'male'])
    
    # 4 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
    info_new=map(lambda item:{'name':item['name'].capitalize(),
                              'sex':item['sex'],
                              'age':item['age'],
                              'salary':item['salary']},info)
    
    print(list(info_new))
    
    for dic in info:
        dic['name'] = dic.get('name').capitalize()
    print(info)
    
    # 5 根据1得到的列表,过滤掉名字以a开头的人的信息
    print([dic for dic in info if not dic.get('name').startswith('a')])
    
    # 6 使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 5 8...)
    def foo(n):
        if n == 1:
            return 0
        if n == 2:
            return 1
        return foo(n-1) + foo(n - 2)
    
    
    def foo(n):
        x, y = 0, 1
        for i in range(1, n+1):
            if i == 1:
                print(x)
            elif i == 2:
                print(y)
            else:
                x, y = y, x+y
                print(y)
    
    print(foo(6))
    
    def fib(a,b,stop):
        if  a > stop:
            return
        print(a,end=' ')
        fib(b,a+b,stop)
    
    
    # 7 一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值
    def foo(obj):
        for i in obj:
            if type(i) is list:
                foo(i)
            else:
                print(i)
    
    l = [1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
    foo(l)
    
  • 相关阅读:
    夜神 虚拟机调试 HBuilder 移动端应用
    maven filter 文件分环境打包部署小问题
    fatal: remote error: CAPTCHA required
    程序员今年是这样计划的
    线程池shutdown与shutdownnow 小例子
    JAVA知识点脉络记忆-刻意练习
    日志
    (职员)2015-12-02 星期三 日志
    (职员)2015-12-04 星期五 周志
    (职员)2015-12-04 星期五 日志
  • 原文地址:https://www.cnblogs.com/chenwenyin/p/12566933.html
Copyright © 2011-2022 走看看