zoukankan      html  css  js  c++  java
  • 异常处理 udp通信

    上传电影

    1.循环打印某个文件夹的所有文件

    2.用户选取要上传的文件

    3.将用户选择的文件上传到服务器

    4.服务器保存你文件

    客户端
    import socket
    import os
    import json
    import struct
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    while True:
        MOVIE_DIR = 'G:Python10期脱产视频day01视频'
        movie_list = os.listdir(MOVIE_DIR)
        for i, movie in enumerate(movie_list,1):  # 获取电影列表,循环展示
            print(i,movie)
        choice = input('>>>:').strip()  #用户选择
        if choice.isdigit():   # 判断是否是数字
            choice = int(choice) - 1
            if choice in range(len(movie_list)):   # 判断用户选择的是否在列表中
                path = movie_list[choice]   # 获取用户上传的文件路径
                print(path)
                file_path = os.path.join(MOVIE_DIR,path)   #获取文件路径
                file_size = os.path.getsize(file_path)  #获取文件大小
                print(file_path)
                print(file_size)
                res = {'name':'大保健','file_size':file_size}  #定义一个字典
                json_d = json.dumps(res)   # 序列化字典
                json_bytes = json_d.encode('utf-8')
                print(json_bytes)
                header = struct.pack('i',len(json_bytes))  #制作一个报头
                client.send(header)  #发送报头
                client.send(json_bytes)  # 发送字典
                with open(file_path,'rb')as f:   # 发文件数据
                    for line in f:
                        client.send(line)
            else:
                print('not in range')
        else:
            print('must be a number')
    
    服务端
    import socket
    import struct
    import json
    import os
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    while True:
        sock,addr = server.accept()
        while True:
            try:
                header_len = sock.recv(4)   # 解析字典报头
                header_len = struct.unpack('i',header_len)[0]
                header_dic = sock.recv(header_len)  # 接收字典数据
                real_dic = json.loads(header_dic.decode('utf-8'))
                print(real_dic)
                print(real_dic.get('file_size'))
                total_size = real_dic.get('file_size')  # 获取字典长度
                print(total_size)
                recv_size = 0  #循环写入文件
                print(real_dic.get('file_size'))
                with open(real_dic.get('name'),'wb')as f:
                    while recv_size < total_size:
                        data = sock.recv(1024)
                        f.write(data)
                        recv_size += len(data)
                    print('上传成功')
            except ConnectionResetError as e:
                print(e)
                break
        sock.close()

    异常处理

    异常处理是在程序运行中出现不可预知的错误,并且该机制没有对应的处理机制,就会报错,使的整个程序无法正常运行

    异常的结构

    1.异常的位置: Traceback (most recent call last):
                        File "D:/python脱产10期视频/day29/01 异常处理.py", line 1, in <module>fdsdfsdf

    2.异常的类型: NameError

    3.异常的信息: name 'fdsdfsdf' is not defined

    异常分两类:

    1. 语法错误:能够一眼看得到,能够立马解决

    2.逻辑错误:一眼看不出来.可以采用异常处理进行捕获

    常见的错误类型
                NameRrror     名字错误
                SyntaxError  语法错误
                KeyError     键不存在
                ValueError   值错误
                IndexError   索引错误

    如何避免异常处理: 在可能出现bug的代码上方try一下, try越少越好

    try:

      可能出错的代码

    except 出错的类型    as  e:  #  将报错的信息赋值给变量

      出错之后的处理机制

    try:
        res = {'name':''}
        print(res['pwd'])
        print(res.get('pwd','None'))
    except KeyError:   #  键值错误
        print('KeyError')
    except NameError:   # 变量名错误
        print('NameError')
    except IndexError:    # 索引错误
        print('IndexError')
    except Exception:     # 所有异常都可以捕获
        print('Exception')
    except BaseException:   # 所有异常都可以捕获
        print('BaseException')
    try:
        l = [1,2,3]
        l[111]
    except Exception:  # 万能异常  所有的异常类型都被捕获
        print('老子天下无敌')
    else:
        print('被检测的代码没有任何的异常发生 才会走else')
    finally:
        print('无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我')
    
    #主动抛异常
    if 'egon' == 'DSB':
        pass
    else:
        raise TypeError('尽说大实话')
    # 关键字raise就是主动抛出异常
    
    l = [1,2,3]
    assert len(l) < 0  # 断言  预言
    # 猜某个数据的状态 猜对了 不影响代码执行 正常走
    # 猜错了  直接报错
    
    # 自定义异常
    class MyError(BaseException):
        def __init__(self, msg):
            super().__init__()
            self.msg = msg
        def __str__(self):
            return '<dfsdf%ssdfsdaf>' % self.msg
    
    raise MyError('我自己定义的异常')  # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法

    UDP通信

       数据报协议(自带报头)

       没有双向通道,通信类似于发短信

    udp 使用
    
    服务端
    import socket
    server = socket.socket(type=socket.SOCK_DGRAM)  #UDP协议
    server.bind(('127.0.0.1',8080))
    while True:
        data,addr = server.recvfrom(1024)
        print('数据:',data)
        print('地址:',addr)
        server.sendto(data.upper(),addr)
    
    服务端
    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    server_address = ('127.0.0.1',8080)
    while True:
        client.sendto(b'hello',server_address)
        data,addr = client.recvfrom(1024)
        print('服务端发来的数据',data)
        print('服务端发来的地址',addr)

    1. udp协议客户端允许发空

    2. udp协议不会粘包

    3. udp协议服务端不存在的情况下,客户照样不会报错

    4. udp协议支持并发

    简易版qq
    
    客户端
    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    server_address = ('127.0.0.1',8080)
    while True:
        res = input('>>>:').strip()
        client.sendto(res.encode('utf-8'),server_address)
        data,server_address = client.recvfrom(1024)
        print(data.decode('utf-8'))
    
    服务端
    import socket
    server = socket.socket(type=socket.SOCK_DGRAM)
    server.bind(('127.0.0.1',8080))
    while True:
        data,addr = server.recvfrom(1024)
        print(data.decode('utf-8'))
        res = input('>>>:').strip()
        server.sendto(res.encode('utf-8'),addr)

    udp类似于发短信

    tcp类似于打电话

    tcp 解决粘包
    客户端
    import socket
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    while True:
        client.send(b'hello')
        data = client.recv(1024)
        print(data.decode('utf-8'))
    
    服务端
    import socketserver
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                data = self.request.recv(1024)
                print(self.client_address)  # 客户端地址
                print(data.decode('utf-8'))  #
                self.request.send(data.upper())
    if __name__ == '__main__':    # 只要有客户连接,会自定义交给类中handler方法去处理
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
        server.serve_forever()   #启动该服务器

    并发: 看起来像同时运行的

    并行: 真正的运行

    网络编程    TCP粘包问题,上传下载文件

    dayehui
  • 相关阅读:
    java第二次作业 数组和String类
    java第一次作业
    选择
    latex math
    sum的写法
    qt 4.8.5 vs 2012编译
    物联网笔记四:物联网网络及协议
    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus
    物联网学习笔记二:物联网网关
    物联网学习笔记一:物联网入门的必备 7 大概念和技能
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11323979.html
Copyright © 2011-2022 走看看