基於tcp協議的套接字通訊
阿新 • • 發佈:2022-12-13
1、套接字socket簡介
Socket是應用層與TCP/UDP協議通訊的中間軟體抽象層,它充當一種介面的角色!封裝了傳輸層以下的東西。
1.1基於tcp的socket通訊流程圖
2.tcp服務端搭建
需求:模擬兩個手機的通話
from ipaddress import IPv4Address import socket # 1.買手機 # socket.AF_INET 指定使用的IPv4地址 # socket.SOCK_STREAM 指定是tcp協議,流式協議,這裡發過來的資料像水流粘在一起,所以會帶來粘包問題 # socket.SOCK_DGRAM 指定的是udp協議,每一份資料都有分隔,所以不會帶來粘包問題 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2.繫結手機卡 # 內部是引數是一個元組,第一引數為服務端自己對應的ip地址,第二個引數為需要繫結的埠 phone.bind(('127.0.0.1',8080)) # 3.開機--開啟監聽(把套接字由主動設定為被動模式) phone.listen(5) # 5指的是半連線池的大小,最大允許128個連線 # 4.等待電話連線請求 while True: # 加上鍊接迴圈 conn ,client_addr = phone.accept() # 返回的是一個元組,分別為,可以通過元組解包的形式得到具體的值 # conn 新的套接字,指的是服務當前的客戶端套接字 # client_addr 客戶端埠和ip地址 # 5.收/發信息 while True: data = conn.recv(1024) # 最大接收的資料量為1024Bytes,收到的也是Bytes型別 conn.send(data.upper()) # 6.關閉電話連線conn conn.close()
3.tcp客戶端搭建
import socket # 1.買電話(與服務端建立連線) phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2.撥通服務端電話 # conneect裡面是一個元組,第一個引數是服務端繫結的ip,第二引數是服務端繫結的埠 phone.connect(('127.0.0.1',8080)) # 3.傳送資訊 while True: msg = input() if msg == 'quit': break phone.send(“msg”.encode('utf-8')) phone.send('hello world'.encode('utf-8')) # 4.接收訊息 # recv_data 是接收到的資料的二進位制,需要decode('utf-8')解碼獲取到資料 recv_data =phone.recv(1024) # 5.關閉連線 phone.close()