socket 上传 -- 异常处理--UDP协议 --自定义socket #29

1.异常处理

 1 ‘‘‘‘‘‘
 2 """
 3 异常处理
 4 """
 5 """
 6 1.什么是异常?
 7     程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,就会以异常的形式表现出来
 8     造成的影响就是整个程序无法再正常运行
 9 """
10 """
11 2.异常的结构:类型+信息+位置
12     1.异常的类型:NAMEERROR
13     2.异常的信息:name ‘fdsdfsdf‘ is not defined
14     3.异常的位置:Traceback (most recent call last):
15               File "D:/python脱产10期视频/day29/01 异常处理.py", line 1, in <module>
16                 fdsdfsdf
17 """
18 """
19 3.异常的种类
20     1.分类
21         1.语法错误
22             是你程序立刻就能解决的,这种错误是不能被容忍的
23                 语法上的错误 发现之后应该立刻解决
24         2.逻辑错误
25             这种错是可以被容忍的 因为一眼看不出来
26                 针对逻辑上的错误  可以采用异常处理机制进行捕获
27
28     2.常见的错误类型
29         NAMERROR     名字错误
30         SyntaxError  语法错误
31         KeyError     键不存在
32         ValueError   值错误
33         IndexError   索引错误
34
35 """
36 """
37 4.如何避免?
38     1.异常处理:
39         在你认为可能出现bug的代码上方try 一下:注try内部的代码越少越好
40
41     2.语法一:
42         try:
43             可能出错的代码
44         except 出错的类型 as e:# 将报错信息赋值给变量e
45             出错以后的处理机制
46         except... # :ps:except可叠加
47     3.语法二:主动报错
48     a = 2
49     b = 3
50     if a > b:
51         print(a+b)
52     else:
53         raise TypeError(a<b)
54
55
56 """
57 # a = 2
58 # b = 3
59 # if a > b:
60 #     print(a+b)
61 # else:
62 #     raise TypeError(a<b)
63 """
64 Traceback (most recent call last):
65   File "E:/Python课堂内容整理/知识点框架/函数--装饰器--迭代器--生成器--常用模块--ATM/day29异常处理,,上传视频/1.异常处理/1.异常处理.py", line 57, in <module>
66     raise TypeError(a<b)
67 TypeError: True
68 """
69 """
70 5.万能异常:finally(最终)
71 """
72 a = 2
73 b = 3
74 try:
75     if a > b:
76         print(a+b)
77 except Exception:  # 万能异常 所有的异常类型都被捕获
78     print(a<b)
79 else:
80     print(‘无异常‘)
81     print(‘被检测的代码没有任何的异常发生 才会走else‘)
82 finally:
83     print(123)
84     print(‘无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我‘)
85 """
86 无异常
87 被检测的代码没有任何的异常发生 才会走else
88 123
89 无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我
90 """

1.异常处理.py

 1 """"""
 2 """
 3 自定义异常
 4 """
 5 # 我的错误类型--继承自基类错误类型
 6 class MyError(BaseException):
 7     def __init__(self,msg):
 8         super().__init__()
 9         self.msg = msg
10     # 自定义打印类型
11     def __str__(self):
12         return "<fsghggdf%sdfgdffgfdgdfgfggd>"%self.msg
13 raise MyError(‘我自定义的异常‘)
14 # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
15 ‘‘‘
16 ‘‘‘
17 """
18 Traceback (most recent call last):
19   File "E:/Python课堂内容整理/知识点框架/函数--装饰器--迭代器--生成器--常用模块--ATM/day29异常处理,,上传视频/1.异常处理/2.自定义异常.py", line 14, in <module>
20     raise MyError(‘我自定义的异常‘)
21 __main__.MyError: <fsghggdf我自定义的异常dfgdffgfdgdfgfggd>
22 """

2.自定义异常.py

2.上传

 1 import socket
 2 import os
 3 import json
 4 import struct
 5 client = socket.socket()
 6 client.connect((‘127.0.0.1‘,9177))
 7 while True:
 8     BAST_PATH = os.path.dirname(os.path.dirname(__file__))
 9     DB_PATH = os.path.join(BAST_PATH,‘movie‘)
10     # 打印电影列表目录
11     movie_list = os.listdir(DB_PATH)
12     for movie in enumerate(movie_list,start=1):
13         print(movie)
14     # 选择下载目录
15     choose = input(‘choose>>>:‘).strip()
16     if choose.isdigit():
17         choose = int(choose)
18         if choose in range(1,len(movie_list)+1):
19
20             file_name = movie_list[choose-1]
21             file_path = os.path.join(DB_PATH,file_name)
22             file_size = os.path.getsize(file_path)
23             user_dic = {
24                 ‘file_name‘:file_name,
25                 ‘file_size‘:file_size,
26                 ‘file_path‘:file_path,
27                 ‘music‘:‘后嘿嘿‘
28             }
29             json_d = json.dumps(user_dic)
30             header = struct.pack(‘i‘,len(json_d))
31             client.send(header)
32             client.send(json_d.encode(‘utf-8‘))
33             with open(file_path,‘rb‘)as f:
34                 for line in f:
35                     client.send(line)
36         else:
37             print(‘choose必须在范围内‘)
38     else:
39         print(‘choose必须为数字‘)

client.py

 1 import socket
 2 import struct
 3 import json
 4 server = socket.socket()
 5 server.bind((‘127.0.0.1‘,9177))
 6 server.listen(5)
 7 while True:
 8     conn,addr = server.accept()
 9     while True:
10         try:
11             header_dict = conn.recv(4)
12             dict_size = struct.unpack(‘i‘,header_dict)[0]
13             dict_bytes = conn.recv(dict_size)
14             dict_json = json.loads(dict_bytes.decode(‘utf-8‘))
15             print(dict_json,‘上传视频大小‘)
16             recv_size = 0
17             file_name = dict_json.get(‘file_name‘)
18             file_size = dict_json.get(‘file_size‘)
19             with open(file_name,‘wb‘)as f:
20                 while recv_size < file_size:
21                     date = conn.recv(1024)
22                     f.write(date)
23                     recv_size += len(date)
24                 print(recv_size,‘接收文件大小‘)
25                 print(f‘{recv_size}文件上传成功‘)
26
27         except ConnectionResetError:
28             break
29     conn.close()

server.py

3.下载
client.py
server.py
4.UDP协议

 1 import socket
 2 # 1.不需要建立连接 直接进入通信循环
 3 client = socket.socket(type=socket.SOCK_DGRAM)
 4 # 1.不需要建立连接 直接进入通信循环
 5 server_addr = (‘127.0.0.1‘,9177)
 6 while True:
 7         client.sendto(b‘hello‘,server_addr)
 8         date,addr = client.recvfrom(1024)
 9         print(date.decode(‘utf-8‘),‘数据‘)
10         print(addr,‘地址‘)

client.py

 1 import socket
 2 # 1.UDP协议
 3 server = socket.socket(type=socket.SOCK_DGRAM)
 4 # 2.插卡
 5 server.bind((‘127.0.0.1‘,9177))
 6 # ps:
 7 # 1.UDP 协议不需要办连接池 ,它也没有半连接词这个概念
 8 # 2.因为没有双向通道,不需要accpet,直接就是循环通信
 9 while True:
10
11     conn,addr = server.recvfrom(1024)
12     # 1.客户端发来消息
13     print(conn.decode(‘utf-8‘),‘数据‘)
14     # 2.客户端的地址
15     print(addr,‘地址‘)
16     server.sendto(conn.upper(),addr)

server.py

5.UDP案例qq

1 import socket
2 client = socket.socket(type=socket.SOCK_DGRAM)
3 server_addr = (‘127.0.0.1‘,9744)
4 while True:
5     msg = input(‘msg>>>:‘).strip()
6     msgs = ‘来自客户端1的消息:%s‘%msg
7     client.sendto(msg.encode(‘utf-8‘),server_addr)
8     date,addr = client.recvfrom(1024)
9     print(date.decode(‘utf-8‘))

client.py

 1 ‘‘‘‘‘‘
 2 """
 3 qq
 4 """
 5 import socket
 6 server = socket.socket(type=socket.SOCK_DGRAM)
 7 server.bind((‘127.0.0.1‘,9744))
 8 while True:
 9     conn,addr = server.recvfrom(1024)
10     print(conn.decode(‘utf-8‘))
11     msg = input(‘msg>>>:‘).encode(‘utf-8‘)
12     server.sendto(msg,addr)

server.py

6.TCP协议与UDP协议的区别

1 6.TCP与UDP的区别:
2     1.UDP协议客户端允许发空
3     2.UDP协议不会粘包(自带报头)
4     3.UDP协议服务端不存在的情况下,照样不会报错(UDP只管发,不管收)
5
6 ps:UDP通信
7     1.数据报协议(自带报头)
8
9     2.没有双向通道 通信类似于发短信

TCP与UDP区别

7.socketserver模块

1 import socket
2 import time
3 client = socket.socket()
4 client.connect((‘127.0.0.1‘,8999))
5 while True:
6     client.send(b‘hello‘)
7     date = client.recv(1024)
8     print(date.decode(‘utf-8‘))
9     time.sleep(1)

client.py

 1 ‘‘‘‘‘‘
 2 """
 3 自定义TCP协议
 4 """
 5 import socketserver
 6
 7 class MyServer(socketserver.BaseRequestHandler):
 8     def handle(self):
 9         print(‘weclcome to you!‘)
10         while True:
11             date = self.request.recv(1024)
12             print(self.client_address)
13             print(date.decode(‘utf-8‘))
14             self.request.send(date.upper())
15 if __name__ == "__main__":
16     """
17     只要有客户端连接,会自动交给自定义类中handle方法去处理
18     """
19     server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8999),MyServer)  # 创建一个基于TCP的对象
20     server.serve_forever()  # 启动该服务对象

server.py

8..socketserver模块-UDP

1 import socket
2 import time
3 client = socket.socket()
4 server_address = (‘127.0.0.1‘,8999)
5 while True:
6     client.sendto(b‘hello‘,server_address)
7     date,addr= client.recvfrom(1024)
8     print(date.decode(‘utf-8‘),addr)
9     time.sleep(1)

client.py

 1 ‘‘‘‘‘‘
 2 """
 3 自定义UDP协议
 4 """
 5 import socketserver
 6
 7 class MyServer(socketserver.BaseRequestHandler):
 8     def handle(self):
 9         print(‘weclcome to you!‘)
10         while True:
11             date,sock = self.request
12             # 客户端地址
13             print(self.client_address)
14             print(date.decode(‘utf-8‘))
15             sock.sendto(date.upper(),self.client_address)
16 if __name__ == "__main__":
17     """
18     只要有客户端连接,会自动交给自定义类中handle方法去处理
19     """
20     server = socketserver.ThreadingUDPServer((‘127.0.0.1‘,8999),MyServer)  # 创建一个基于TCP的对象
21     server.serve_forever()  # 启动该服务对象

server.py

readme

 1 复习
 2 socket套接字
 3 TCP协议
 4 1.最简易版本的客户端与服务端通信
 5 2.通信循环
 6 recv()  阻塞
 7 3.连接循环
 8 accept()  阻塞
 9 4.TCP粘包问题
10 struct模块 对数据进行打包处理
11 pack  unpack
12
13 服务端:
14     1.生成一个字典
15     2.制定该字典的报头
16     json序列化
17     编码统计长度
18     3.发送字典的报头
19     4.发送字典
20     5.最后发真实数据
21 客户端:
22     1.现接受固定长度的4个字节字典报头
23     2.解析获取字典数据的长度
24     unpack(...)[0]
25     3.接受字典数据
26     解码,反序列化
27     4.接受真实数据
28
29 ps:为什么要多加一个字典?
30     1.打包的数据大小有限
31     2.可以携带更多的信息
32
33 并发:看起来像同时运行的
34 并行:真正意义上的同时运行

readme

原文地址:https://www.cnblogs.com/llx--20190411/p/11324732.html

时间: 2024-11-02 14:01:48

socket 上传 -- 异常处理--UDP协议 --自定义socket #29的相关文章

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Android基础入门教程——7.6.4 基于UDP协议的Socket通信

Android基础入门教程--7.6.4 基于UDP协议的Socket通信 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来Socket的最后一节:基于UDP协议的Socket通信,在第一节中我们已经详细地 比较了两者的区别,TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行 数据传输,如果你学了前两节TCP的,传输前先开服务端,accept,等客户端接入,然后获得 客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,

基于UDP协议的socket编程

UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启动服务端. 2.不可靠.数据在本地通过网络发出之后,UDP协议会立即清除本地的缓存,即使对方没有收到该数据,也不做任何补救措施. 3.数据报协议. 代码示例: 1 import socket 2 server = socket.socket(socket.AF_INET,socket.SOCK_DG

php 利用socket上传文件

php 利用socket上传文件 张映 发表于 2010-06-02 分类目录: php 一,利用fsockopen来上传文件 以前我写过一篇关于socket通信原理的博文http://blog.51yip.com/php/673.html有兴趣的朋友可以看看,前面讲的那篇博文,socket的服务器和客户端都是要用php命令来运行的.平常我们上传文件是浏览本地文件,通过一个php程序将文件上传一个地方,这个时候我们用php命令来运行php程序就不方便了.这个时候我们可以用fsockopen来打开

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一个UDP协议的服务器 server.bind(("127.0.0.1",8080)) while True: data,addr = server.recvfrom(1024) server.sendto(data.upper(),addr) server

102 基于UDP协议的socket套接字

目录 一.基于UDP协议的socket套接字编程 1.1 用法 1.2 udp协议的特点 1.3 实例 一.基于UDP协议的socket套接字编程 socket套接字包括使用TCP协议和UDP协议进行通讯 1.1 用法 socket指定使用UDP通讯协议server = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM) 发送udp数据server.sendto(发送数据) 接收udp数据data, addr = server.recvfr

基于UDP协议的socket套接字编程

基于UDP协议的socket套接字编程 一.UDP套接字简单示例 1.1 服务器 import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议->UDP server.bind(('127.0.0.1', 8080)) while True: data, client_addr = server.recvfrom(1024) print('===>', data, client_addr) ser

基于UDP协议之——socket编程

一. socket API 前面一篇<基于TCP协议之--socket编程>http://2627lounuo.blog.51cto.com/10696599/1775559已经花了大量的篇幅讲述了socket和使用基本的socket API所需要注意的问题,这里就不再赘述了.下面主要谈论的是UDP和TCP在socket编程中的不同之处: 1. 创建sock 和TCP面向连接的可靠的字节流传输服务不同的是,UDP是无连接的不可靠的数据报传输服务:虽然有所不同,但同样在进程间通信的时候需要提供出

网络 基于UDP协议的socket编程

一.UDP协议        UDP协议的特点:用户数据包协议             1.UDP协议是无连接的.也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延.             2.UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表.(网上的的可靠性建立在应答的基础上,不提供可靠性交付,即不需要应答,因此不需要维护状态表)             3.UDP是面向报文.发送方