python網(wǎng)絡(luò)編程tcp客戶端及服務(wù)端解讀
python網(wǎng)絡(luò)編程tcp客戶端及服務(wù)端
Python 的 socket 模塊是用于網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)庫,提供了低級別的網(wǎng)絡(luò)接口,允許程序通過網(wǎng)絡(luò)進行通信。
以下是對 Python socket 模塊的簡要介紹,包括其基本概念、常用功能和示例。
基本概念
Socket:Socket 是網(wǎng)絡(luò)通信的端點。它可以是一個客戶端或服務(wù)器,允許在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)。
協(xié)議:socket 模塊支持多種網(wǎng)絡(luò)協(xié)議,最常用的是 TCP(傳輸控制協(xié)議)和 UDP(用戶數(shù)據(jù)報協(xié)議)。
- TCP:面向連接的協(xié)議,提供可靠的數(shù)據(jù)傳輸。
- UDP:無連接的協(xié)議,傳輸速度快,但不保證數(shù)據(jù)的可靠性。
IP 地址和端口:每個 socket 都與一個 IP 地址和一個端口號相關(guān)聯(lián)。IP 地址標(biāo)識網(wǎng)絡(luò)上的設(shè)備,端口號標(biāo)識設(shè)備上的特定服務(wù)。
常用功能
創(chuàng)建 Socket:
- 使用
socket.socket()創(chuàng)建一個新的 socket 對象。 - 需要指定地址族(如
socket.AF_INET表示 IPv4)和套接字類型(如socket.SOCK_STREAM表示 TCP)。
綁定(Bind):
- 使用
bind()方法將 socket 綁定到特定的 IP 地址和端口號。
監(jiān)聽(Listen):
- 服務(wù)器使用
listen()方法開始監(jiān)聽傳入的連接請求。
接受連接(Accept):
- 使用
accept()方法接受客戶端的連接請求,返回一個新的 socket 對象和客戶端的地址。
連接(Connect):
- 客戶端使用
connect()方法連接到服務(wù)器。
發(fā)送和接收數(shù)據(jù):
- 使用
send()和sendall()方法發(fā)送數(shù)據(jù)。 - 使用
recv()方法接收數(shù)據(jù)。
關(guān)閉 Socket:
- 使用
close()方法關(guān)閉 socket 連接。
tcp客戶端
import socket target_host = "127.0.0.1" target_port = 65423 # 創(chuàng)建客戶端套接字 # socket.AF_INET:表示選擇IPv4的地址,socket.SOCK_STREAM:表示TCP傳輸協(xié)議類型 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #連接客戶端 connect the client client.connect((target_host,target_port)) #使用GET方法發(fā)送數(shù)據(jù) message = "hello,socker" client.sendall(message.encode()) #返回數(shù)據(jù)最大字符為4096 response = client.recv(4096) #打印返回數(shù)據(jù) print(response.decode()) #關(guān)閉連接 client.close()
tcp服務(wù)端
import socket
import threading
IP = "0.0.0.0"
PORT = 65423
def main():
# 創(chuàng)建客戶端套接字對象
# socket.AF_INET:表示選擇IPv4的地址,socket.SOCK_STREAM:表示TCP傳輸協(xié)議類型
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定PORT和IP
server.bind((IP, PORT))
# 設(shè)置客戶端最大連接數(shù)量5
server.listen(5)
# 打印開啟監(jiān)聽IP和PORT
print(f" [*] Listening on {IP}:{PORT}")
# 建立連接
# 讓服務(wù)器進入主循環(huán)中,并在該循環(huán)中等待外來連接
while True:
client, address = server.accept()
# 打印已接受的客戶端連接的ip和端口
print(f"[*] Accepted connection from {address[0]}:{address[1]}")
# 創(chuàng)建一個新的線程client_handler,用于處理與該客戶端的通信
client_handler = threading.Thread(target=handle_client, args=(client,))
# 啟動線程開始處理客戶端請求
client_handler.start()
# 定義處理客戶端請求的函數(shù)handle_client,接受一個客戶端套接字作為參數(shù)
def handle_client(client_socket):
# 使用with語句確保在處理完客戶端請求后自動關(guān)閉套接字
with client_socket as sock:
# 從客戶端最多接受1024字節(jié)的數(shù)據(jù)
request = sock.recv(1024)
# 打印接收到的請求內(nèi)容,使用decode("utf-8")將字節(jié)數(shù)據(jù)解碼為字符串
print(f"[*] Received: {request.decode('utf-8')}") # 修正引號問題
# 向客戶端發(fā)送確認(rèn)消息ACK,表示已經(jīng)接收到請求
sock.send(b"ACK")
if __name__ == "__main__":
main()使用編寫的tcp客戶端給服務(wù)發(fā)送幾個測試的數(shù)據(jù)包,應(yīng)該會看到以下輸出
[*] Listening on 0.0.0.0:65423
[*] Accepted connection from 127.0.0.1:63382
[*] Received: hello,socker
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python常見數(shù)據(jù)結(jié)構(gòu)之棧與隊列用法示例
這篇文章主要介紹了Python常見數(shù)據(jù)結(jié)構(gòu)之棧與隊列用法,結(jié)合實例形式簡單介紹了數(shù)據(jù)結(jié)構(gòu)中棧與隊列的概念、功能及簡單使用技巧,需要的朋友可以參考下2019-01-01
python實現(xiàn)動態(tài)數(shù)組的示例代碼
這篇文章主要介紹了python實現(xiàn)動態(tài)數(shù)組的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python中導(dǎo)入 train_test_split提示錯誤的解決
這篇文章主要介紹了python中導(dǎo)入 train_test_split提示錯誤的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
簡單介紹一下pyinstaller打包以及安全性的實現(xiàn)
這篇文章主要介紹了簡單介紹一下pyinstaller打包以及安全性的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

