python網(wǎng)絡(luò)編程tcp客戶端及服務(wù)端解讀
python網(wǎng)絡(luò)編程tcp客戶端及服務(wù)端
Python 的 socket
模塊是用于網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)庫(kù),提供了低級(jí)別的網(wǎng)絡(luò)接口,允許程序通過(guò)網(wǎng)絡(luò)進(jìn)行通信。
以下是對(duì) Python socket
模塊的簡(jiǎn)要介紹,包括其基本概念、常用功能和示例。
基本概念
Socket:Socket 是網(wǎng)絡(luò)通信的端點(diǎn)。它可以是一個(gè)客戶端或服務(wù)器,允許在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)。
協(xié)議:socket
模塊支持多種網(wǎng)絡(luò)協(xié)議,最常用的是 TCP(傳輸控制協(xié)議)和 UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。
- TCP:面向連接的協(xié)議,提供可靠的數(shù)據(jù)傳輸。
- UDP:無(wú)連接的協(xié)議,傳輸速度快,但不保證數(shù)據(jù)的可靠性。
IP 地址和端口:每個(gè) socket 都與一個(gè) IP 地址和一個(gè)端口號(hào)相關(guān)聯(lián)。IP 地址標(biāo)識(shí)網(wǎng)絡(luò)上的設(shè)備,端口號(hào)標(biāo)識(shí)設(shè)備上的特定服務(wù)。
常用功能
創(chuàng)建 Socket:
- 使用
socket.socket()
創(chuàng)建一個(gè)新的 socket 對(duì)象。 - 需要指定地址族(如
socket.AF_INET
表示 IPv4)和套接字類型(如socket.SOCK_STREAM
表示 TCP)。
綁定(Bind):
- 使用
bind()
方法將 socket 綁定到特定的 IP 地址和端口號(hào)。
監(jiān)聽(tīng)(Listen):
- 服務(wù)器使用
listen()
方法開(kāi)始監(jiān)聽(tīng)傳入的連接請(qǐng)求。
接受連接(Accept):
- 使用
accept()
方法接受客戶端的連接請(qǐng)求,返回一個(gè)新的 socket 對(duì)象和客戶端的地址。
連接(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()) #返回?cái)?shù)據(jù)最大字符為4096 response = client.recv(4096) #打印返回?cái)?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)建客戶端套接字對(duì)象 # 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) # 打印開(kāi)啟監(jiān)聽(tīng)I(yíng)P和PORT print(f" [*] Listening on {IP}:{PORT}") # 建立連接 # 讓服務(wù)器進(jìn)入主循環(huán)中,并在該循環(huán)中等待外來(lái)連接 while True: client, address = server.accept() # 打印已接受的客戶端連接的ip和端口 print(f"[*] Accepted connection from {address[0]}:{address[1]}") # 創(chuàng)建一個(gè)新的線程client_handler,用于處理與該客戶端的通信 client_handler = threading.Thread(target=handle_client, args=(client,)) # 啟動(dòng)線程開(kāi)始處理客戶端請(qǐng)求 client_handler.start() # 定義處理客戶端請(qǐng)求的函數(shù)handle_client,接受一個(gè)客戶端套接字作為參數(shù) def handle_client(client_socket): # 使用with語(yǔ)句確保在處理完客戶端請(qǐng)求后自動(dòng)關(guān)閉套接字 with client_socket as sock: # 從客戶端最多接受1024字節(jié)的數(shù)據(jù) request = sock.recv(1024) # 打印接收到的請(qǐng)求內(nèi)容,使用decode("utf-8")將字節(jié)數(shù)據(jù)解碼為字符串 print(f"[*] Received: {request.decode('utf-8')}") # 修正引號(hào)問(wèn)題 # 向客戶端發(fā)送確認(rèn)消息ACK,表示已經(jīng)接收到請(qǐng)求 sock.send(b"ACK") if __name__ == "__main__": main()
使用編寫的tcp客戶端給服務(wù)發(fā)送幾個(gè)測(cè)試的數(shù)據(jù)包,應(yīng)該會(huì)看到以下輸出
[*] Listening on 0.0.0.0:65423
[*] Accepted connection from 127.0.0.1:63382
[*] Received: hello,socker
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用Tkinter庫(kù)如何設(shè)置tkinter ttk框架背景顏色
本文介紹了在Python的Tkinter庫(kù)中,如何使用style.configure方法為ttk框架設(shè)置背景顏色及其他樣式屬性,以定制美觀的GUI界面2024-09-09Python基礎(chǔ)語(yǔ)法之變量與數(shù)據(jù)類型詳解
這篇文章主要為大家詳細(xì)介紹了Python基礎(chǔ)語(yǔ)法中變量與數(shù)據(jù)類型的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-07-07win10下python3.8的PIL庫(kù)安裝過(guò)程
這篇文章主要介紹了win10下python3.8的PIL庫(kù)安裝方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子
這篇文章主要介紹了Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03python保留小數(shù)點(diǎn)位數(shù)的多種方式(附demo)
在Python中,保留小數(shù)點(diǎn)后特定位數(shù)可以通過(guò)多種方式實(shí)現(xiàn),以下是幾種常見(jiàn)的方法,并附上相應(yīng)的代碼示例,使用字符串格式化,使用round()函數(shù),使用Decimal模塊和使用numpy庫(kù),文中通過(guò)代碼講解的非常詳細(xì),需要的朋友可以參考下2024-06-06win10系統(tǒng)Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安裝教程
這篇文章主要介紹了win10系統(tǒng) Anaconda 和 Pycharm 的 Tensorflow2.0 之 CPU和 GPU 版本安裝教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python sklearn對(duì)文本數(shù)據(jù)進(jìn)行特征化提取
這篇文章主要介紹了Python sklearn對(duì)文本數(shù)據(jù)進(jìn)行特征化提取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-04-04使用IDLE的Python shell窗口實(shí)例詳解
在本篇文章里小編給各位整理的是關(guān)于使用IDLE的Python shell窗口實(shí)例詳解內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-11-11pycharm 使用心得(六)進(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)管理
功能簡(jiǎn)介:pycharm自帶了一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)插件,可以比較方便的進(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)操作。2014-06-06