異常處理
程序在運行中出現了不可預知的錯誤python
而且該錯誤沒有對應的處理機制,那麼就會以異常的形式表現出來編程
整個程序沒法運行併發
異常的種類
1 NameError 名字錯誤socket
2 SyntaxError 語法錯誤tcp
3 KeyError 鍵不存在post
4 ValueError 值錯誤spa
5 IndexError 索引錯誤code
6 Exception/BaseException 能夠接受全部錯誤server
如何避免 異常處理 在你認爲可能會出現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()
客戶端1
能夠多個客戶端,與服務端交互
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)