2,上传电影,udp,异常处理,socketserver
今日内容 1,作业:实现用户循环上传电影 2,异常处理 3,UDP通信 4,SocketServer 1,作业: 客户端: import os import struct import socket import json client = socket.socket() client.connect(('127.0.0.1', 1688)) while True: # 获取文件的绝对路径 MOVIE_PATH = r'D:\预习视频\day12\视频' # 获取电影列表目录 movie_list = os.listdir(MOVIE_PATH) # 循环打印电影列表 for i, movie in enumerate(movie_list): print(i, movie) # 让用户选择 电影列表编号 choice = input('请输入商品编号:').strip() if choice.isdigit(): choice = int(choice) if choice in range(0, len(movie_list)): # 获取用户选择的电影路径 path = movie_list[choice] # 拼接电影的绝对路径 path_dir = os.path.join(MOVIE_PATH,path) # 获取文件大小 file_size = os.path.getsize(path_dir) # 创建一个字典 d = {'name':'爱你一生千百惠.mp4', 'file_size': file_size, 'ps': '喝酒别开车!'} # 对该字典进行序列化 json_dict = json.dumps(d) # 把序列化后的字符串转化为二进制数据 dict_bytes = json_dict.encode('utf-8') # 创建字典报头 header = struct.pack('i', len(dict_bytes)) # 发送字典报头 client.send(header) # 发送字典 client.send(dict_bytes) # 循环发送真实的文件数据 with open(path_dir, 'rb')as f: for line in f: client.send(line) else: print('选择不在范围之内') else: print('请选择数字!') 服务端: import struct import socket import json server = socket.socket() server.bind(('127.0.0.1', 1688)) server.listen(5) while True: conn, addr = server.accept() while True: try: # 接受报的规定长度 header_len = conn.recv(4) # 先解析字典的报头 header_len = struct.unpack('i',header_len)[0] # 接受字典 header_dict = conn.recv(header_len) # 把接受到的二进制数据反序列化成json格式字典 dict_json = json.loads(header_dict.decode('utf-8')) # 从字典中获取文件大小 file_size = dict_json.get('file_size') # 循环接受并写入文件 recv_size = 0 # 在这里获取的是字典的名字 with open(dict_json.get('name'), 'wb')as f: while recv_size < file_size: data = conn.recv(1024) # 读出来1024个字节的数据就将它写入文件 f.write(data) # 直到写入文件的数据全部为被接受完的数据 ****************** recv_size+=len(data) except ConnectionResetError as e: print(e) break conn.close() 2:异常处理 什么是异常? 程序在运行过程中出现了不可预知的错误 并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 造成的影响就是整个程序无法再正常运行 异常的结构 1.异常的类型:NAMEERROR 2.异常的信息:name 'fdsdfsdf' is not defined 3.异常的位置:Traceback (most recent call last): File "D:/python脱产10期视频/day29/01 异常处理.py", line 1, in <module> fdsdfsdf 异常的种类 分为两大类 1.语法错误 是你程序立刻就能解决的,这种错误是不能被容忍的 语法上的错误 发现之后应该立刻解决 2.逻辑错误 **** 这种错是可以被容忍的 因为一眼看不出来 针对逻辑上的错误 可以采用异常处理机制进行捕获,用try,except ps: except 后面跟错误类型 常见的错误类型 NAMERROR 名字错误 ********** SyntaxError 语法错误 ********** KeyError 键不存在 ********** ValueError 值错误 ********** IndexError 索引错误 ********** try: name l = [1,2,3] l[111] d = {'name':'jason'} d['password'] except NameError: print('NameError') except IndexError: print('indexerror') except KeyError: print('keyerror') ps:1,错误发生后,会立刻停止代码的运行, 2,会走第一个except,只要出错。下面的except都不会走 3,except BaseException: # 万能异常 所有的异常类型都被捕获 Exception也是万能异常,他继承了BaseException 如何避免 异常处理 在你认为可能会出现bug的代码块上方try一下:注意try内部的代码块越少越好 ***** try: 可能出错的代码 except 出错的类型 as e: # 将报错信息赋值给变量e 出错之后的处理机制 ================================ try: # name l = [1,2,3] l[111] # d = {'name':'jason'} # d['password'] except Exception: # 万能异常 所有的异常类型都被捕获 print('老子天下无敌') else: print('被检测的代码没有任何的异常发生 才会走else') finally: print('无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行 主动抛异常 if 'egon' == 'DSB': pass else: raise TypeError('尽说大实话') 关键字raise就是主动抛出异常 l = [1,2,3] assert len(l) < 0 # 断言 预言 猜某个数据的状态 猜对了 不影响代码执行 正常走 猜错了 直接报错 l = [1,2,3] assert len(l) < 0 # 断言 预言 猜某个数据的状态 猜对了 不影响代码执行 正常走 猜错了 直接报错 自定义异常 9 自定义异常 class MyError(BaseException): def __init__(self,msg): super().__init__() self.msg=msg def __str__(self): return '<dfsdf%ssdfsdaf>' %self.msg raise MyError('我自己定义的异常') # 主动抛出异常其实就是将异常类的对象 3,UDP 协议 1,udp 不会粘包,因为他是数据报协议,自带报头 2,不需要建立链接,直接进行发送数据,没有双向通道,就像发送短信一样 3,当服务端不存在时 ,也不会报错,客户端允许发空 客户端: import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1',1688) while True: client.sendto(b'fggfgfghyhjh',server_addr) data, addr = client.recvfrom(1024) print('服务端发来的数据',data) print('服务端的地址',addr) 服务端: import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 1688)) # udp 不需要设置半连接池,没有链接池这个概念 # 没有双向通道,所以不需要accept ,直接通信循环 while True: data, addr = server.recvfrom(1024) 接受数据 print('数据', data) # 客户端发来的数据 print(addr) # 客户端的ip地址和端口 server.sendto(data.lower(),addr) 发送数据 # 数据和地址 简易版本的qq案例: 服务端: import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 1688)) while True: data, addr = server.recvfrom(1024) print(data.decode('utf-8')) msg = input('>>>>:') server.sendto(msg.encode('utf-8'),addr) 客户端: import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 1688) while True: msg = input('>>>>:') msg = '来自客户端0的数据:%s'% msg client.sendto(msg.encode('utf-8'),server_addr) data, addr = client.recvfrom(1024) print(data.decode('utf-8')) 4,SocketServer(让tcp支持并发,也可支持UDP) 客户端: 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__': # 创建一个tcp对象 server = socketserver.ThreadingTCPServer(('127.0.0.1',1688),MyServer) server.serve_forever()
转载于:https://www.cnblogs.com/Fzhiyuan/p/11324179.html
2,上传电影,udp,异常处理,socketserver相关推荐
- d29天 上传电影练习 UDP使用 ScketServer模块
TCP小结 socket套接字TCP1.最简易的版本的客户端与服务端之间通信2.通信循环recv() 阻塞 3.连接循环accept() 阻塞4.TCP粘包问题5.struct模块 对数据进行打包处理 ...
- 利用宝塔linux面板+苹果CMS搭建电影网站(二)网站的配置+电影资源的爬取上传
在利用宝塔linux面板+苹果CMS-----从0搭建一个电影网站(一)里已经初始创建了一个电影网站的雏形 接下来需要对网站进行编辑修改上传电影资源 达到这一种效果; 网站修改编辑 进入网站后台 ip ...
- 11.FastAPI上传文件
上传文件 上传小文件(File) """Request Files 单文件.多文件上传及参数详解""" from fastapi impor ...
- UDP协议和socketserver以及文件上传
文件上传代码 服务端 import socket import os import json import structserver = socket.socket() server.bind(('1 ...
- Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)
一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...
- 并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。...
并发编程知识总结 软件开发架构 C/S: client:客户端 server:服务端 优点:占用网络资源少,软件的使用稳定 缺点:服务端更新后,客户端也要更新,需要使用多个软件,需要下载多个客户端 B ...
- Zuul微服务网关、容错与监控、Zuul路由端点、路由配置、Zuul上传文件、Zuul过滤器、Zuul异常处理、Zuul回退、Zuul聚合微服务
一.为什么要使用微服务网关 二.Zuul 1.编写Zuul微服务网关 2.Zuul的Hystrix容错与监控 3.Zuul的路由端点 4.路由配置 1.自定义指定微服务的访问路径 2.忽略指定微服务 ...
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...
- PHP异常处理类(文件上传提示)
知识点: 大部分时候我们的代码总有各种各样的bug,新手程序员(比如我)最经常的工作就是不停的报错和echo变量,一个好的异常处理类可以帮我们更快+更容易理解报错代码的问题,同时,异常处理还可以避免一 ...
最新文章
- Citrix XenDesktop 7.X 视频播放优化
- kettle、Oozie、camus、gobblin
- dubbo 消费者也要暴露端口吗_一文详细解读 Dubbo 中的 http 协议
- python—while循环、字符串
- ajax 异步插入图片到数据库(多图上传)
- 24.Forbidden
- 《构建高性能Web站点》观后感
- 黑龙江职业学院校赛第二场题解
- SG 函数初步 HDU 1536 amp;amp; HDU 1944
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
- windows下WDK创建免费的测试证书,并签名windows驱动文件(附带测试效果)
- bin文件用cad打开_bin文件 打开方法_win7如何打开bin 格式的文件图文步骤
- python中查找文件当前位置定位,Python是怎样定位和修改文件读写位置的?
- mqtt简介及在web端的应用(接入阿里iot)
- 根本不赚钱,你为何还坚持写博客?
- 电影后台管理系统(实训)
- select属性标签
- java 数字转化为汉字_工具类_java 数字转化为汉字大写
- 一块链习公开课:从 0 到 1 构建去中心化应用 | ArcBlock 预告
- 担心PPT封面页不够出彩?这些例子建议收藏