首页 > 编程语言 > 详细

Python 异常及处理 文件上传事例 UDP socketserver模块

时间:2019-08-08 17:30:51      阅读:77      评论:0      收藏:0      [点我收藏+]

一 异常及异常处理

1.什么是异常:程序在运行的过程中出现了不可预知的错误,如果没有对应的处理机制和处理不当的话,会造成程序无法正常运行下去。

2.异常的结构:

技术分享图片

 

#1.异常类型:NameError

#2异常信息: name ‘name‘ is not defined

#3异常位置: File "E:/python10期/day29 基于tcp文件上传 udp scketserver/代码/发送大文件/test.py", line 1, in <module>

3.异常分类:

#1.语法错误:运行代码前都会先检测代码,期间发生的异常就是语法异常。作为一名合格的程序员不应该出现语法错误,出现问题后立即解决。

#2.逻辑错误:主要是因为逻辑不正确没有得到程序正确的执行结果,需要理清代码逻辑更改。

技术分享图片
常见的错误类型
            NAMERROR     名字错误
            SyntaxError  语法错误
            KeyError     键不存在
            ValueError   值错误
            IndexError   索引错误
View Code

4.异常处理:

技术分享图片
try:
    可能出错的代码
except 出错的类型 as e:  # 将报错信息赋值给变量e
    出错之后的处理机制
View Code

# 拓展

技术分享图片
try:
    # 代码块
  
except Exception:  # 万能异常  所有的异常类型都被捕获(代码块报错时执行)
#     print(‘老子天下无敌‘)
else: # 代码块没有错误时执行
#     print(‘被检测的代码没有任何的异常发生 才会走else‘)
finally: # (最后一定执行)
#     print(‘无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我‘)
View Code

# 抛出异常和断言

技术分享图片
当我们的程序在执行过程中由于接收到的参数不正确或者其他情况导致,后续代码无法执行时,可以主动抛出异常

使用raise关键字,后面跟任意Exception的子类或子类实例

# 直接抛出异常 
raise TypeError
# 直接抛出异常 并附加错误信息
raise TypeError("类型错误")


# 主动抛异常
# if ‘egon‘ == ‘DSB‘:
#     pass
# else:
#     raise TypeError(‘尽说大实话‘)
# 关键字raise就是主动抛出异常
View Code
技术分享图片
断言是就是断定的意思,当一些代码的执行必须满足某个条件时,就需要先断定条件在继续执行,当然你可以使用`if`判断来处理
# l = [1,2,3]
# assert len(l) < 0  # 断言  预言
# 猜某个数据的状态 猜对了 不影响代码执行 正常走
View Code
技术分享图片
# 自定义异常
# 自定义异常
class MyError(BaseException):
     def __init__(self,msg):
         super().__init__()
         self.msg=msg
     def __str__(self):
         return <dfsdf%ssdfsdaf> %self.msg

raise MyError(我自己定义的异常)  # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
View Code

 

二 UDP通信

1.什么是udp协议:中文名是用户数据报协议,提供简单不可靠信息传送服务。

2.udp特点:

1.udp协议客户端允许发空
2.udp协议不会粘包(自带报头,每一次发送都是一个单独的数据报,所以不会产生粘包问题)
3.udp协议服务端不存在的情况下,客户端照样不会报错?
4.udp协议支持并发

3.语法:

 

技术分享图片
客户端
import socket


client = socket.socket(type=socket.SOCK_DGRAM)
# 不需要建立连接  直接进入通信循环
server_address = (127.0.0.1,8080)
while True:
    client.sendto(bhello,server_address)
    data, addr = client.recvfrom(1024)
    print(服务端发来的数据,data)
    print(服务端的地址,addr)

服务端
import socket


server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind((127.0.0.1,8080))
# UDP不需要设置半连接池 它也没有半连接池的概念

# 因为没有双向通道  不需要accept  直接就是通信循环
while True:
    data, addr = server.recvfrom(1024)
    print(数据:,data)  # 客户端发来的消息
    print(地址:,addr)  # 客户端的地址
    server.sendto(data.upper(),addr)

# 注意:发送和接收时的地址和端口一定是对方的
View Code

4.UDP实现简单版QQ功能

#客服端1

技术分享图片
import socket


client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (127.0.0.1,8080)

while True:
    msg = input(>>>:)
    msg = 来自客户端1的消息:%s%msg
    client.sendto(msg.encode(utf-8),server_address)
    data, server_addr = client.recvfrom(1024)
    print(data.decode(utf-8))
View Code

#客服端2

技术分享图片
import socket


client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (127.0.0.1,8080)

while True:
    msg = input(>>>:)
    msg = 来自客户端1的消息:%s%msg
    client.sendto(msg.encode(utf-8),server_address)
    data, server_addr = client.recvfrom(1024)
    print(data.decode(utf-8))
View Code

 

#服务端

技术分享图片
import socket


server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind((127.0.0.1,8080))
# UDP不需要设置半连接池 它也没有半连接池的概念

# 因为没有双向通道  不需要accept  直接就是通信循环
while True:
    data, addr = server.recvfrom(1024)
    print(数据:,data)  # 客户端发来的消息
    print(地址:,addr)  # 客户端的地址
    server.sendto(data.upper(),addr)
View Code

 

5.UDP和TCP区别

技术分享图片
1.没有连接  

2.不会粘包     每次发送都是一个独立的数据包    



TCP 对数据完整性要求较高 : 在线支付  ,文字信息 

 UDP: 对数据不要求完整性 但是要快 :  视频 语音 游戏  
View Code

三 socketserver模块

# 基于TCP

技术分享图片
客户端
import socket

client = socket.socket()
client.connect((127.0.0.1,8080))

while True:
    client.send(bhello)
    data = client.recv(1024)
    print(data.decode(utf-8))

服务端
import socketserver


class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print(‘来啦 老弟‘)
        while True:
            data = self.request.recv(1024)
            print(self.client_address)  # 客户端地址
            print(data.decode(utf-8))
            self.request.send(data.upper())


if __name__ == __main__:
    """只要有客户端连接  会自动交给自定义类中的handle方法去处理"""
    server = socketserver.ThreadingTCPServer((127.0.0.1,8080),MyServer)  # 创建一个基于TCP的对象
    server.serve_forever()  # 启动该服务对象
View Code

# 基于UDP

技术分享图片
客户端
import socket
import time

client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (127.0.0.1,8080)

while True:
    client.sendto(bhello,server_address)
    data,addr = client.recvfrom(1024)
    print(data.decode(utf-8),addr)

服务端‘’
import socketserver


class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print(‘来啦 老弟‘)
        while True:
            data,sock = self.request
            print(self.client_address)  # 客户端地址
            print(data.decode(utf-8))
            sock.sendto(data.upper(),self.client_address)


if __name__ == __main__:
    """只要有客户端连接  会自动交给自定义类中的handle方法去处理"""
    server = socketserver.ThreadingUDPServer((127.0.0.1,8080),MyServer)  # 创建一个基于TCP的对象
    server.serve_forever()  # 启动该服务对象
View Code

Python 异常及处理 文件上传事例 UDP socketserver模块

原文:https://www.cnblogs.com/tfzz/p/11322482.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!