程序在运行中出现了不可预知的错误
并且该错误没有对应的处理机制,那么就会以异常的形式表现出来
整个程序无法运行
异常的种类
1 NameError 名字错误
2 SyntaxError 语法错误
3 KeyError 键不存在
4 ValueError 值错误
5 IndexError 索引错误
6 Exception/BaseException 可以接受所有错误
如何避免 异常处理 在你认为可能会出现bug的代码块上方try一下:注意try内部的代码块越少越好
try: 可能出错的代码 except 出错的类型 as e: # 将报错信息赋值给变量e 出错之后的处理机制 try: name l = "asdasd" l[12312313] except Exception: print("asdasd") else: print("asdasd") finally: print("assdasd")
这是异常的最复杂结构了
udp通信
又叫数据报协议(自带报头)
没有双向通道,与tcp相比,udp就是发短信(只管给你发,不管你是否能收到),tcp就是打电话(必须我们先要拨通手机才才能通信)
代码格式,后tcp的不同点
服务端
import socket # 创建套接字对象 server = socket.socket(type=socket.SOCK_DGRAM) # 还需绑定端口 server.bind(("127.0.01", 8181)) # 直接发生和接收消息,不需要在listen和accept了 date, address = server.recvfrom(1024) print(date, address) server.sendto(b'adassd', address)
客户端
import socket # 创建一个套接字对象 client = socket.socket(type=socket.SOCK_DGRAM) # 设置一个IP地址和端口号的变量 address = ("127.0.0.1", 8181) # 发送消息用sendto并且需要两个参数一个是发送的消息还有一个是地址,与tcp不同的是,tcp用的send只需要一参数 client.sendto(b'asdasda', address) # 接收消息过后也有两个参数,第一个是消息内容,还有一个是ip端口tcp只有一个参数,接收的是信息 date, address = client.recvfrom(1024) print(date, address)
基于udp我们可以写一个简易版的QQ
服务端
import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(("127.0.0.1",8787)) while True: date,address = server.recvfrom(1024) print(date.decode("utf-8"),address) msg = input("请输入内容").strip().encode("utf-8") server.sendto(msg,address)
客户端
import socket client = socket.socket(type=socket.SOCK_DGRAM) address = ("127.0.0.1",8787) while True: msg = input("请输入内容").strip().encode("utf-8") client.sendto(msg,address) date,addre = client.recvfrom(1024) print(date.decode("utf-8"),addre)
udp的四个特点
1允许发空
2不粘包
3协议服务端断开,客户端也不会报错
4支持并发
socketserver
可以让,tcp向udp一样的并发编程
服务端可以与多个客户端同时交流
服务端
import socketserver # 先创建一个类,继承 socketserver.BaseRequestHandler class MyServer(socketserver.BaseRequestHandler): # 定义一个方法handler里面写发送语句,和接收语句 def handle(self): while True: date = self.request.recv(1024) print(self.client_address) print(date.decode("utf-8")) self.request.send(date.upper()) if __name__ == '__main__': # 创建对象,将端口,和我们创建的类,传给对象 server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer) # 调用serve_forever方法 server.serve_forever()
可以多个客户端,与服务端交互
import socket client = socket.socket() client.connect(("127.0.0.1",8888)) while True: client.send(b'asdad') date = client.recv(1024) print(date)
客户端2
import socket client = socket.socket() client.connect(("127.0.0.1",8888)) while True: client.send(b'asdad') date = client.recv(1024) print(date)