udp以及socketserver模塊用法

異常處理

程序在運行中出現了不可預知的錯誤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)
相關文章
相關標籤/搜索