揭秘Python?Socket網(wǎng)絡(luò)編程的7種硬核用法
上周老板拍著我的肩膀說:“小花啊,我們需要一個在線客服系統(tǒng),你用 Python 搞個 Socket 聊天室吧!”
我心里嘀咕:Socket 不就發(fā)發(fā)消息、寫個聊天室?這玩意兒能有什么花頭?
結(jié)果一查,哎喲,好家伙,Socket 不僅能做聊天室,還能干一大堆硬核操作!今天就帶大家看看 Python 網(wǎng)絡(luò)編程的 7 種超實(shí)用玩法,學(xué)會了你就是公司最靚的仔!
1.端口掃描器:探測開放端口
還在手動檢查服務(wù)器端口?那你可就太 low 了!用 Python 搞個端口掃描器,幾秒鐘就能搞定:
import socket def scan_ports(ip, start=1, end=65535): print(f"開始掃描 {ip} 上的端口...") for port in range(start, end + 1): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(0.5) # 設(shè)置超時時間,加快掃描速度 if s.connect_ex((ip, port)) == 0: print(f"? 端口 {port} 開放") s.close() # 掃描本機(jī)所有端口 scan_ports("127.0.0.1")
掃描邏輯: 通過嘗試與目標(biāo)主機(jī)的每個端口建立TCP連接(全連接掃描),根據(jù)連接結(jié)果判斷端口開放狀態(tài)
關(guān)鍵方法
socket.socket()
:創(chuàng)建IPv4 TCP套接字connect_ex()
:比connect()
更優(yōu),返回錯誤碼而非拋出異常(0表示成功)settimeout(0.5)
:防止在無響應(yīng)端口上長時間阻塞
使用場景
- 快速檢查本地服務(wù)開放情況(如測試Web服務(wù)器/數(shù)據(jù)庫端口)
- 小型網(wǎng)絡(luò)環(huán)境中的簡單掃描
局限性及注意事項(xiàng)
- 效率問題:順序掃描65535端口約需9小時(理想情況),建議:
- 使用多線程/異步IO加速
- 優(yōu)先掃描常用端口(如80,443,22,3306等)
- 權(quán)限要求:掃描1024以下端口需要管理員權(quán)限
- 隱蔽性差:全連接掃描易被防火墻/IDS檢測
- 法律風(fēng)險:掃描他人網(wǎng)絡(luò)可能違法,僅限授權(quán)測試
建議在實(shí)際使用中考慮使用專業(yè)掃描工具(如nmap),并遵守網(wǎng)絡(luò)安全法律法規(guī)。該代碼更適合用于學(xué)習(xí)網(wǎng)絡(luò)編程基礎(chǔ)原理。
2.簡易 HTTP 服務(wù)器:10 秒搭個網(wǎng)頁
監(jiān)聽端口 8090
,接收 HTTP
請求,然后返回簡單的 Hello, Socket!
。
import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("", 8090)) server.listen(5) print("HTTP 服務(wù)器啟動,監(jiān)聽端口 8090...") while True: client, addr = server.accept() request = client.recv(1024) response = "HTTP/1.1 200 OK\n\nHello, Socket!" client.sendall(response.encode()) client.close()
在本地8090端口啟動TCP服務(wù)器,接收客戶端請求后返回固定HTTP響應(yīng),每次請求后立即關(guān)閉連接(短連接)
關(guān)鍵特性
單線程同步:每次處理一個請求,處理完才能接受新連接
最小HTTP響應(yīng):
HTTP/1.1 200 OK ← 狀態(tài)行
← 空行(兩個換行符)
Hello, Socket! ← 響應(yīng)體
無請求解析:忽略客戶端發(fā)送的實(shí)際請求內(nèi)容
使用場景
- 快速測試網(wǎng)絡(luò)連通性
- 學(xué)習(xí)socket編程基礎(chǔ)
- 開發(fā)簡單網(wǎng)絡(luò)服務(wù)原型
注意事項(xiàng)
- 性能限制:
- 無法并發(fā)處理請求
- 超過5個連接請求會被拒絕
- 功能缺失:
- 不解析HTTP請求
- 沒有錯誤處理
- 不支持持久連接
- 安全風(fēng)險:實(shí)際生產(chǎn)環(huán)境應(yīng)使用成熟框架(如Flask/Django)
測試方法:瀏覽器訪問 http://localhost:8090
或使用 curl http://localhost:8090
3.局域網(wǎng)游戲:多人聯(lián)機(jī)對戰(zhàn)
游戲開發(fā)離不開網(wǎng)絡(luò)通信,Socket 就是幕后功臣!
簡單示例:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("", 9999)) print("等待數(shù)據(jù)...") while True: data, addr = s.recvfrom(1024) print(f"收到來自 {addr} 的消息: {data.decode()}")
在本地9999端口啟動UDP服務(wù),持續(xù)接收并顯示客戶端發(fā)送的數(shù)據(jù)報(bào)文,支持同時接收多個客戶端的消息
關(guān)鍵特性
- 無連接協(xié)議:不需要建立連接(對比TCP的三次握手)
- 數(shù)據(jù)報(bào)文模式:每次接收完整的數(shù)據(jù)包
- 被動接收:持續(xù)等待客戶端主動發(fā)送數(shù)據(jù)
使用場景
- 局域網(wǎng)聊天程序
- 傳感器數(shù)據(jù)采集(如IoT設(shè)備)
- 網(wǎng)絡(luò)狀態(tài)監(jiān)控
- 廣播/組播應(yīng)用
注意事項(xiàng)
- 數(shù)據(jù)完整性:
- UDP不保證數(shù)據(jù)順序和可靠性
- 大消息可能被截?cái)啵ㄗ畲蠼邮?024字節(jié))
- 并發(fā)處理:
- 默認(rèn)單線程處理,高并發(fā)時需要異步機(jī)制
- 安全風(fēng)險:
- 開放端口需配置防火墻
- 接收任意來源數(shù)據(jù)可能被攻擊
- 編碼問題:
- 假設(shè)數(shù)據(jù)為UTF-8編碼,可能需處理解碼異常
測試方法:使用 nc -u 目標(biāo)IP 9999
發(fā)送測試消息,或配合UDP客戶端代碼使用。適用于需要低延遲但允許丟包的場景。
4. 遠(yuǎn)程控制:控制另一臺計(jì)算機(jī)
想遠(yuǎn)程控制服務(wù)器?用 Socket 輕松實(shí)現(xiàn):
import socket import subprocess s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 9999)) s.listen(1) print("等待連接...") conn, addr = s.accept() print(f"連接自 {addr}") while True: cmd = conn.recv(1024).decode() output = subprocess.getoutput(cmd) conn.send(output.encode())
在本地9999端口啟動TCP服務(wù),接受客戶端連接后進(jìn)入交互模式,執(zhí)行客戶端發(fā)送的系統(tǒng)命令并將結(jié)果返回(類似后門程序)
關(guān)鍵特性
- 命令執(zhí)行:通過
subprocess
模塊直接執(zhí)行接收到的字符串命令 - 持續(xù)交互:保持連接直到客戶端斷開
- 單客戶端模式:
listen(1)
限制同時只能處理一個連接
使用場景
- 滲透測試:模擬遠(yuǎn)程控制軟件行為
- 內(nèi)網(wǎng)管理工具:需配合嚴(yán)格權(quán)限控制
- 網(wǎng)絡(luò)編程教學(xué):演示基礎(chǔ)C/S架構(gòu)
高危風(fēng)險警告
- 致命漏洞:
- 開放端口無身份驗(yàn)證,允許任意客戶端連接
- 直接執(zhí)行原始命令,可被注入危險指令(如
rm -rf /
)
- 數(shù)據(jù)安全:
- 通信未加密,可能被中間人篡改
- 系統(tǒng)風(fēng)險:
- 客戶端可執(zhí)行任意系統(tǒng)命令,等同于完全控制系統(tǒng)
注意事項(xiàng)(切勿用于生產(chǎn)環(huán)境)
- 該代碼實(shí)際是高危后門程序
- 運(yùn)行后會暴露服務(wù)器完全控制權(quán)
- 可能違反《網(wǎng)絡(luò)安全法》等法律法規(guī)
建議學(xué)習(xí)時在虛擬機(jī)環(huán)境測試,實(shí)際應(yīng)用需至少添加:
- SSL/TLS加密通信
- 客戶端身份驗(yàn)證
- 命令白名單機(jī)制
- 權(quán)限隔離措施
測試方法:使用 nc 目標(biāo)IP 9999
連接后直接輸入系統(tǒng)命令(如whoami
),適用于理解網(wǎng)絡(luò)通信原理,但必須注意法律和道德邊界。
5. 文件傳輸:快速共享文件
還在用 U 盤拷貝文件?試試 Python 版 FTP:
import socket s = socket.socket() s.connect(("127.0.0.1", 9999)) with open("file.txt", "rb") as f: s.sendall(f.read()) print("文件已發(fā)送!")
作為TCP客戶端連接到本機(jī)9999端口,讀取本地file.txt
文件內(nèi)容,將文件內(nèi)容通過TCP連接完整發(fā)送
關(guān)鍵特性
- 二進(jìn)制傳輸:
rb
模式確保文件無編碼轉(zhuǎn)換 - 單次發(fā)送:
sendall()
保證發(fā)送全部數(shù)據(jù)(對比send()
可能分多次) - 自動清理:
with
語句確保文件正確關(guān)閉
使用場景
- 配合文件接收服務(wù)端(需另寫)實(shí)現(xiàn)文件傳輸
- 快速測試網(wǎng)絡(luò)傳輸功能
- 小型數(shù)據(jù)同步工具原型
注意事項(xiàng)
服務(wù)端匹配:
- 需要對應(yīng)的TCP文件接收服務(wù)器(非之前示例的命令執(zhí)行服務(wù)器)
- 當(dāng)前代碼若連接到之前的命令服務(wù)器會導(dǎo)致協(xié)議混亂
潛在問題:
- 大文件可能導(dǎo)致內(nèi)存溢出(一次性讀取全部內(nèi)容)
- 無傳輸驗(yàn)證機(jī)制(接收方是否正確接收未知)
- 無錯誤處理(如文件不存在、連接失敗等情況)
安全提示
- 傳輸敏感文件需使用加密協(xié)議(如SFTP)
- 開放端口需配置防火墻規(guī)則
- 實(shí)際應(yīng)用應(yīng)添加文件校驗(yàn)(如MD5校驗(yàn)和)
測試方法:需先運(yùn)行支持文件接收的TCP服務(wù)器(需另寫),再執(zhí)行此客戶端代碼。適合學(xué)習(xí)基礎(chǔ)網(wǎng)絡(luò)傳輸原理,生產(chǎn)環(huán)境建議使用成熟的文件傳輸協(xié)議(如FTP/SCP)。
6. 負(fù)載均衡:提高服務(wù)器性能
大型網(wǎng)站都用負(fù)載均衡來提高訪問速度,我們可以用 Socket 模擬一個:
import socket import random targets = ["192.168.1.2", "192.168.1.3", "192.168.1.4"] s = socket.socket() s.bind(("", 8000)) s.listen(5) while True: conn, addr = s.accept() target = random.choice(targets) conn.send(target.encode()) conn.close()
在本地8000端口啟動TCP服務(wù),當(dāng)客戶端連接時,隨機(jī)選擇一個預(yù)設(shè)IP地址返回,立即關(guān)閉連接(單次響應(yīng)模式)
工作流程
客戶端連接 → 服務(wù)器隨機(jī)選擇IP → 返回IP → 斷開連接
使用場景
- 簡易負(fù)載均衡(隨機(jī)分配客戶端到不同服務(wù)器)
- 客戶端重定向服務(wù)
- 多節(jié)點(diǎn)服務(wù)的入口分配
關(guān)鍵特性
- 無狀態(tài)交互:每次連接僅響應(yīng)一次
- 隨機(jī)分配策略:使用
random.choice
簡單輪換 - 高并發(fā)基礎(chǔ):
listen(5)
允許短暫排隊(duì)
注意事項(xiàng)
功能限制:
- 未驗(yàn)證客戶端身份
- 無心跳檢測,無法感知目標(biāo)服務(wù)器狀態(tài)
- 隨機(jī)分配可能造成負(fù)載不均
安全風(fēng)險:
- 開放端口可能被DDoS攻擊
- 返回內(nèi)部IP可能泄露網(wǎng)絡(luò)拓?fù)?/li>
- 建議添加HTTPS加密通信
協(xié)議規(guī)范:
- 客戶端應(yīng)驗(yàn)證接收數(shù)據(jù)的有效性
- 建議使用JSON格式擴(kuò)展更多信息:
測試方法
使用telnet或nc工具測試:
$ nc localhost 8000 192.168.1.3 # 隨機(jī)返回其中一個IP
該代碼適用于小型內(nèi)部系統(tǒng)的簡易服務(wù)發(fā)現(xiàn),生產(chǎn)環(huán)境建議使用成熟方案(如Nginx負(fù)載均衡、Consul服務(wù)發(fā)現(xiàn))。需配合客戶端邏輯實(shí)現(xiàn)真正的重定向功能。
7.網(wǎng)絡(luò)代理服務(wù)器
import socket proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM) proxy.bind(("", 8888)) proxy.listen(5) while True: client, addr = proxy.accept() target = socket.socket(socket.AF_INET, socket.SOCK_STREAM) target.connect(("example.com", 80)) data = client.recv(4096) target.sendall(data) response = target.recv(4096) client.sendall(response) client.close() target.close()
- 流量中轉(zhuǎn):在客戶端(
8888端口
)和目標(biāo)服務(wù)器(example.com:80
)之間建立雙向通道 - 單次轉(zhuǎn)發(fā):每次連接僅處理一次請求/響應(yīng)(短連接模式)
- 協(xié)議透明:適用于任意TCP協(xié)議(HTTP/HTTPS等)
工作流程
客戶端 → 代理:8888 → example.com:80
│ ↑
│ │
└───────────────────┘
關(guān)鍵特性
- 同步阻塞:單線程順序處理,無法并發(fā)
- 緩沖區(qū)限制:單次最多傳輸4KB數(shù)據(jù)
- 目標(biāo)固定:所有流量都轉(zhuǎn)發(fā)到
example.com:80
使用場景
- 本地調(diào)試:將流量導(dǎo)向測試服務(wù)器
- 協(xié)議分析:觀察原始TCP數(shù)據(jù)流
- 簡易網(wǎng)關(guān):實(shí)現(xiàn)端口映射功能
局限性及風(fēng)險
- 性能問題: • 每次連接新建socket,高并發(fā)時資源消耗大 • 未實(shí)現(xiàn)流式傳輸(大文件會截?cái)啵?/li>
- 功能缺陷: • 無法動態(tài)修改目標(biāo)地址 • 不支持HTTPS等加密協(xié)議 • 無錯誤處理(連接失敗導(dǎo)致崩潰)
- 安全風(fēng)險: • 開放8888端口可能被濫用 • 明文傳輸敏感數(shù)據(jù)
該代碼適合學(xué)習(xí)基礎(chǔ)網(wǎng)絡(luò)轉(zhuǎn)發(fā)原理,生產(chǎn)環(huán)境建議使用成熟代理工具(如Nginx、Squid)。如需實(shí)現(xiàn)完整代理協(xié)議,需處理HTTP頭中的Host
字段和連接復(fù)用等機(jī)制。
到此這篇關(guān)于揭秘Python Socket網(wǎng)絡(luò)編程的7種硬核用法的文章就介紹到這了,更多相關(guān)Python Socket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
tensorflow 環(huán)境變量設(shè)置方式
今天小編就為大家分享一篇tensorflow 環(huán)境變量設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02python實(shí)現(xiàn)對doc,txt,xls文檔的讀寫操作
這篇文章主要介紹了python實(shí)現(xiàn)對doc,txt,xls文檔的讀寫操作,正如標(biāo)題所見,文章包括三個部分python實(shí)現(xiàn)對doc文檔的讀取、python實(shí)現(xiàn)對txt文檔的讀取和python實(shí)現(xiàn)對xls表格的讀取,需要的朋友可以參考一下2022-04-04Python?Flask實(shí)現(xiàn)圖片上傳與下載的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Flask實(shí)現(xiàn)圖片上傳與下載(支持漂亮的拖拽上傳),文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)精靈的使用上篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,下面開始講解精靈的使用2022-08-08