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