日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python网络通信框架_Python运维-Socket网络编程 (1)

發(fā)布時(shí)間:2025/3/21 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络通信框架_Python运维-Socket网络编程 (1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python socket 簡介

在計(jì)算機(jī)通信領(lǐng)域,socket 被翻譯為“套接字”,它是計(jì)算機(jī)之間進(jìn)行通信的一種約定或一種方式。通過 socket 這種約定,一臺(tái)計(jì)算機(jī)可以接收其他計(jì)算機(jī)的數(shù)據(jù),也可以向其他計(jì)算機(jī)發(fā)送數(shù)據(jù)

套接字是通信的基石,是支持TCP/IP協(xié)議的路通信的基本操作單元。Socket(套接字)可以看成是兩個(gè)網(wǎng)絡(luò)應(yīng)用程序進(jìn)行通信時(shí),各自通信連接中的端點(diǎn),這是一個(gè)邏輯上的概念。

網(wǎng)絡(luò)世界一切皆 socket。如果我們精通 socket?又 熟悉 應(yīng)用層的高層協(xié)議. 那我們就可以通過socket連接網(wǎng)絡(luò)世界中的一切。

黑客不需要網(wǎng)絡(luò)網(wǎng)絡(luò)編程知識(shí)?框架這么多何必自己實(shí)現(xiàn)?

網(wǎng)絡(luò)一直都是黑客最喜愛的競(jìng)技場(chǎng). 通過簡單的網(wǎng)絡(luò)訪問,攻擊者可以做到任何事情。例如主機(jī)掃描、數(shù)據(jù)包注入、數(shù)據(jù)嗅探、遠(yuǎn)程攻擊主機(jī),等等。如果通過某種方式進(jìn)入了目標(biāo)企業(yè)的內(nèi)部網(wǎng)絡(luò),那么在這個(gè)陌生的環(huán)境中,你可能會(huì)發(fā)現(xiàn)主機(jī)陷入了某種困境: 你沒有任何工具進(jìn)行網(wǎng)絡(luò)攻擊,沒有natcat, 沒有wireshark,沒有編譯器,甚至沒有辦法安裝編譯器。然而在很多情況下,你可能會(huì)驚訝地發(fā)現(xiàn)目標(biāo)環(huán)境中安裝了Python,這就是下一步的工作起點(diǎn), 不僅是黑客, 我們的網(wǎng)絡(luò)管理員、機(jī)房管理員,在某些情況下也會(huì)用到。

Python socket 模塊可以快速創(chuàng)建 TCP 和 UDP服務(wù)器及客戶端

TCP 客戶端

在滲透測(cè)試中我們經(jīng)常會(huì)遇到需要?jiǎng)?chuàng)建一個(gè)TCP客戶端來連接服務(wù)、發(fā)送垃圾數(shù)據(jù)、進(jìn)行模糊測(cè)試或者進(jìn)行其他任務(wù)的情況。多說無益,我們開始編寫代碼。

① 首先我們創(chuàng)建一個(gè)套接字, 你可能會(huì)發(fā)現(xiàn)我沒有使用參數(shù)選擇協(xié)議 AF_INET 和類型 SOCK_STREAM. 因?yàn)樗J(rèn) AF_INET 表示的IPv4地址, 類型是 SOCK_STREAM說明這是一個(gè)TCP客戶端。 ② 連接到目標(biāo)地址和端口, 該方法接受一個(gè)元組 (IPAddress, Port) 建立連接失敗是回拋出異常,? 建立連接成功后我們就可以收發(fā)數(shù)據(jù)了。 ③ 使用 send() 方法發(fā)送數(shù)據(jù)注意是字節(jié)流數(shù)據(jù), byte, 可以使用 encode() 方法將字符串類型 轉(zhuǎn)為 字節(jié)類型。④ 使用 recv() 方法接受數(shù)據(jù)具體大小根據(jù)你傳入的參數(shù)大小決定。 單位是字節(jié)。接受的數(shù)據(jù)是字節(jié)流數(shù)據(jù),可以使用 decode() 方法將字節(jié)類型轉(zhuǎn)為字符串類型。⑤ 程序不用了就關(guān)閉連接

TCP 服務(wù)器

用 Python 創(chuàng)建 TCP 服務(wù)端和創(chuàng)建客戶端一樣簡單。我們可以綁定到命令行 shell 或者創(chuàng)建一個(gè)代理(后續(xù))。加下來我們創(chuàng)建一個(gè)TCP服務(wù)器

① 綁定監(jiān)聽地址和端口 ② 設(shè)置最大掛起連接等待數(shù),③ 接受連接,該方法返回兩個(gè)結(jié)果 遠(yuǎn)程(客戶端)套接字對(duì)象, 遠(yuǎn)程(客戶端)連接地址和端口(阻塞方法),④ 接受客戶端數(shù)據(jù), 注意這里是阻塞的(客戶端沒法信息就會(huì)一直等等到又信息才會(huì)往下執(zhí)行),⑤ 發(fā)送數(shù)據(jù),該方法也會(huì)阻塞如果客戶端一直沒有接受也會(huì)一直阻塞

執(zhí)行結(jié)果

客戶端和服務(wù)端都編寫完成了我們先允許服務(wù)端 再允許客戶端看一下結(jié)果

服務(wù)端

客戶端

運(yùn)行沒有問題, 他們可以互相通訊了。

問題

運(yùn)行是可以運(yùn)行了但是,服務(wù)器和客戶端一次鏈接只能交換一次數(shù)據(jù),非常不符合現(xiàn)在服務(wù)器的標(biāo)準(zhǔn)。可以這么解決呢??? 上面提到有三個(gè)阻塞的方法. accept()、send()、recv()。這三個(gè)方法都是先等對(duì)方有相應(yīng)的行為才會(huì)往下執(zhí)行?;禺a(chǎn)生上面問題呢?? 我們一 一解決, 如果中間覺得繁瑣可以跳到最終解決方法

解決只能通訊一次(保持連接)

現(xiàn)在的連接叫 短連接,即數(shù)據(jù)交換完成之后立刻斷開連接. 目前在使用短連接的大家都熟悉的 HTTP 通訊協(xié)議

客戶端

代碼邏輯幾乎沒變, ① while True進(jìn)入循環(huán) ② 接受用戶輸入(阻塞方法), ③ 判斷用戶是否輸入 exit() 退出循環(huán), 關(guān)閉連接。然后發(fā)送數(shù)據(jù), 接受響應(yīng). 打印響應(yīng)信息,循環(huán)進(jìn)行。

服務(wù)器

大致邏輯也沒變, ① 連接成功后進(jìn)入循環(huán), ② 接受客戶端數(shù)據(jù) ③ 如果接受到 exit() 退出循環(huán)關(guān)閉連接。循環(huán)操作。

服務(wù)端的發(fā)送(響應(yīng))數(shù)據(jù)也可以 加上 input監(jiān)聽用戶輸入, 這樣就可以實(shí)現(xiàn) 半雙工通訊了 即同一時(shí)間段只有一邊可以發(fā)送數(shù)據(jù)另外一邊接受數(shù)據(jù)。例子: 對(duì)講機(jī)

我們來看一下執(zhí)行結(jié)果

客戶端

服務(wù)器

長連接通訊就完成了, 我們只要不主動(dòng)斷開連接就可以一直交換數(shù)據(jù), 但是還存在上面問題呢...

我們來將一下整套程序的流程, 服務(wù)器開啟監(jiān)聽服務(wù). 客戶端連接, 連接成功后 服務(wù)器和客戶端進(jìn)入循環(huán), 互相通訊, 直到程序退出 才斷開連接。看似沒什么問題呀... 但你會(huì)發(fā)現(xiàn) 第二個(gè)人想嘗試連接這個(gè)服務(wù)器時(shí)... 連接是沒報(bào)錯(cuò) 但也沒執(zhí)行到 while True 可以交換信息.

原因是我們的服務(wù)器沒把 accept 寫到循環(huán)里(我的意料之外...我也忘記了)如果寫道循環(huán)里大家想想. accept 是阻塞.. 那就套兩層循環(huán). 對(duì)套兩層循環(huán) 下面這樣

這樣就會(huì)出現(xiàn)剛剛的問題了 連接上了但是服務(wù)器沒有處理我的連接, 因?yàn)樗谔幚砩弦粋€(gè)客戶端的連接, 服務(wù)器此時(shí)處于忙碌狀態(tài)。

為什么連接成功了呢?因?yàn)槲覀冊(cè)O(shè)置了 Listen(5) 最大掛起等待連接數(shù) 5, (意思是當(dāng)服務(wù)器忙碌時(shí)能有多少臺(tái)客戶端在排隊(duì)等待). 你把他設(shè)低一點(diǎn), 然后連多幾個(gè)你就會(huì)發(fā)現(xiàn)超過數(shù)量后會(huì)報(bào)錯(cuò)。

最終解決

其實(shí)還存在我沒提及的很多問題.. 例如 同一時(shí)間只能一方作為發(fā)送端的半雙工通訊。我們現(xiàn)在來解決, 我們需要將 recv() 和 send() 方法寫成異步非阻塞的就行了。

服務(wù)器

我們借助了多線程是我們的程序達(dá)到異步效果. ① 接收到一個(gè)連接后, 使用多線程交給 函數(shù) handler_connect處理, 將 conn, addr 傳給該函數(shù)。② 循環(huán)接受數(shù)據(jù). 此時(shí)是另一個(gè)線程在做不會(huì)影響主線程 accpet() 繼續(xù)接受連接

客戶端

邏輯和服務(wù)器差不多. 我們連接成功后, 開啟線程處理服務(wù)器響應(yīng)信息, 循環(huán)發(fā)送信息. 直到主動(dòng)退出, 此時(shí)服務(wù)器就可以同時(shí)處理多條連接了

總結(jié)

以上是生活随笔為你收集整理的python网络通信框架_Python运维-Socket网络编程 (1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。