1.簡介
本來打算再寫一篇這個系列的文章也要和小伙伴或者童鞋們說再見了,可是有人留言問WebSocket包和小程序的包不會抓,那就關(guān)于這兩個知識點(diǎn)宏哥就再水兩篇文章。
2.什么是Socket?
在計算機(jī)通信領(lǐng)域,socket 被翻譯為“套接字”(套接字=主機(jī)+端口號),它是計算機(jī)之間進(jìn)行通信的一種約定或一種方式。通過 socket這種約定,一臺計算機(jī)可以接收其他計算機(jī)的數(shù)據(jù),也可以向其他計算機(jī)發(fā)送數(shù)據(jù)
socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read關(guān)閉close”模式來操作。
我的理解就是Socket就是該模式的一個實(shí)現(xiàn),它只是提供了一個針對TCP或者UDP編程的接口:即socket是一種特殊的文件,一些socket函數(shù)就是對其進(jìn)行的操作(讀/寫IO、打開、關(guān)閉)。
socket抽象層在網(wǎng)絡(luò)中的位置圖解,如下圖所示:
?如果你想學(xué)習(xí)接口自動化測試,我這邊給你推薦一套視頻,這個視頻可以說是B站播放全網(wǎng)第一的接口自動化測試教程,同時在線人數(shù)到達(dá)1000人,并且還有筆記可以領(lǐng)取及各路大神技術(shù)交流:798478386? ???
【已更新】B站講的最詳細(xì)的Python接口自動化測試實(shí)戰(zhàn)教程全集(實(shí)戰(zhàn)最新版)_嗶哩嗶哩_bilibili【已更新】B站講的最詳細(xì)的Python接口自動化測試實(shí)戰(zhàn)教程全集(實(shí)戰(zhàn)最新版)共計200條視頻,包括:1.【接口自動化】目前軟件測試的市場行情以及測試人員能力標(biāo)準(zhǔn)。、2.【接口自動化】全面熟練Requests庫以及底層方法調(diào)用邏輯、3.【接口自動化】接口自動化實(shí)戰(zhàn)及正則和JsonPath提取器的應(yīng)用等,UP主更多精彩視頻,請關(guān)注UP賬號。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337
3.Socket通信流程
Socket通信流程,如下圖所示:
根據(jù)socket通信基本流程圖,總結(jié)通信的基本步驟:
服務(wù)器端:
第一步:創(chuàng)建一個用于監(jiān)聽連接的Socket對像;
第二步:用指定的端口號和服務(wù)器的ip建立一個EndPoint對像;
第三步:用socket對像的Bind()方法綁定EndPoint;
第四步:用socket對像的Listen()方法開始監(jiān)聽;
第五步:接收到客戶端的連接,用socket對像的Accept()方法創(chuàng)建一個新的用于和客戶端進(jìn)行通信的socket對像;
第六步:通信結(jié)束后一定記得關(guān)閉socket;
客戶端:
第一步:建立一個Socket對像;
第二步:用指定的端口號和服務(wù)器的ip建立一個EndPoint對像;
第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為參數(shù),向服務(wù)器發(fā)出連接請求;
第四步:如果連接成功,就用socket對像的Send()方法向服務(wù)器發(fā)送信息;
第五步:用socket對像的Receive()方法接受服務(wù)器發(fā)來的信息 ;
第六步:通信結(jié)束后一定記得關(guān)閉socket;
4.python實(shí)現(xiàn)一個客戶端與服務(wù)端的通信
4.1函數(shù)
Socket對象方法:
服務(wù)端:
函數(shù) | 描述 |
---|---|
.bind() | 綁定地址關(guān)鍵字,AF_INET下以元組的形式表示地址。常用bind((host,port)) |
.listen() | 監(jiān)聽TCP,可以掛起的最大連接數(shù),該值至少為1,一般設(shè)為5即可 |
.accept() | 被動接受TCP客戶端的連接 |
客戶端:
函數(shù) | 描述 |
---|---|
.connect() | 初始化服務(wù)器連接 |
.connect_ex() | 是對connect()函數(shù)的擴(kuò)展,當(dāng)出錯時返回出錯碼,不報異常 |
其它函數(shù): |
函數(shù) | 描述 |
---|---|
.recv() | 接收數(shù)據(jù),數(shù)據(jù)以字符串的形式返回,bufsize指定接收的最大數(shù)據(jù)量。 |
.send() | 發(fā)送數(shù)據(jù),將string中的數(shù)據(jù)發(fā)送到連接的套接字,返回值是要發(fā)送的字節(jié)數(shù)量,通常使用.encode()函數(shù)對數(shù)據(jù)進(jìn)行轉(zhuǎn)碼 |
.senddall() | 發(fā)送完整的數(shù)據(jù),在返回之前會嘗試發(fā)送所有數(shù)據(jù),成功返回None,失敗則拋出異常。 |
.recvfrom() | 與recv()函數(shù)類似,不同的是返回值是(data,address),其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。 |
.sendto() | 發(fā)送UDP數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,形式是(ipaddr,port)的元組。 |
.close() | 關(guān)閉套接字 |
4.2服務(wù)端
使用socket函數(shù)來創(chuàng)建一個socket對象,并設(shè)置一個socket服務(wù),然后通過bind(hostname,port)函數(shù)來指定一個端口,使用socket對象的accept方法,等待客戶端的連接,并返回connection對象。具體步驟為:
#創(chuàng)建服務(wù)端套接字
serversocket=socket()
#把地址綁定到套接字
serversocket.bind()
#對連接進(jìn)行監(jiān)聽
serversocket.listen()
#使用一個while進(jìn)行循環(huán),并接收客戶端的連接
while True:
serverclient=serversocket.accept()
while True:
#接收已發(fā)送
serverclient.recv()
serverclient.send()
#關(guān)閉客戶端套接字
serverclient.close()
#關(guān)閉服務(wù)端套接字
serversocket.close()
4.3具體代碼實(shí)現(xiàn)
實(shí)現(xiàn)功能:通過while實(shí)現(xiàn)循環(huán)接收客戶端發(fā)送的數(shù)據(jù),并對客戶端發(fā)送的數(shù)據(jù)進(jìn)行顯示并返回給客戶端數(shù)據(jù),返回給客戶端的數(shù)據(jù)信息后加入時間戳。新建一個文件server.py。
import socket
import sys
import time
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()#獲取本地主機(jī)名
port=9999
#綁定端口號
serversocket.bind((host,port))
#設(shè)置最大連接數(shù)
serversocket.listen(5)
while True:
print('服務(wù)器啟動,監(jiān)聽客戶端鏈接')
clientsocket,addr=serversocket.accept()
print('鏈接地址:%s' % str(addr))
while True:
try:
data=clientsocket.recv(1024)
except Exception:
print('斷開的客戶端:',addr)
break
print('客戶端發(fā)送內(nèi)容:',data.decode('utf-8'))
reply=input('回復(fù):').strip()
if not reply:
break
msg=time.strftime('%Y-%m-%d %X')#獲取結(jié)構(gòu)化時間戳
msg1='[%s]:%s'% (msg,reply)
clientsocket.send(msg1.encode('utf-8'))
clientsocket.close()
serversocket.close()
4.4客戶端
創(chuàng)建一個客戶端用來連接以上服務(wù)的的服務(wù),使用socket.connect()方法打開一個TCP連接到主機(jī),連接后可以從服務(wù)端獲取數(shù)據(jù),在操作完成后關(guān)閉連接。
具體步驟為:
#創(chuàng)建客戶端的套接字
client=socket()
#嘗試連接服務(wù)器
client.connect()
#發(fā)送并接收數(shù)據(jù)
client.send()
client.recv()
#關(guān)閉客戶端套接字
client.close()
4.5具體代碼實(shí)現(xiàn)
*新建一個文件client.py。*
import socket
import sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=9999
s.connect((host,port))
while True:
data= input('>>').strip()
if not data:
break
s.send(data.encode('utf-8'))
msg=s.recv(1024)
if not msg:
break
print(msg.decode('utf-8'))
s.close()
4.6測試
使用cmd命令行中打開到代碼所在文件目錄,執(zhí)行python 服務(wù)端文件名.py,再另打開一個cmd命令界面執(zhí)行 python 客戶端文件名.py。
1.在cmd中運(yùn)行服務(wù)端代碼,運(yùn)行結(jié)果,如下圖所示:
2.在cmd中運(yùn)行客戶端代碼,運(yùn)行結(jié)果,如下圖所示:
好了到此就實(shí)現(xiàn)了,但是抓不到包,不知道是不是因?yàn)榉?wù)端和客戶端都在宏哥本地一臺電腦的原因,算了宏哥直接網(wǎng)上找了一個在線的演示給大家。?
5.實(shí)戰(zhàn)抓WebSocket包
由于時間關(guān)系,宏哥沒有嘗試將客戶端和服務(wù)器分開看看是否可以抓到包,然后在網(wǎng)上找了一個地址:http://coolaf.com/tool/chattest ?演示給大家。具體操作步驟如下:
1.Fiddler V4.5以上版本,rules>customize rules,加入如下代碼,把websocket通信日志加入log,如下圖所示:
2.class Handler 類中添加,添加的代碼如下:
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
// Log Message to the LOG tab
FiddlerApplication.Log.LogString(oMsg.ToString());
}
?
3.打開PC版的聊天室(宏哥提供的演示地址),并刷新Fiddler,會看到一個WS圖標(biāo)的請求,雙擊該請求,右邊會出現(xiàn)websocket的tab頁,如下圖所示:
PC版在線聊天,如下圖所示:
Fiddler抓的WebSocket包,如下圖所示:
4.切換到log tab頁可以看到通信的數(shù)據(jù)往來,如下圖所示:
5.通過F12也可以看到websocket的請求信息,進(jìn)入聊天室后,F(xiàn)12>network>濾斗(放大鏡左邊的這個紅色圖標(biāo))>WS,雙擊name里邊這個,即展開相關(guān)的詳情,在詳情里選中某條數(shù)據(jù),底部會進(jìn)一步顯示全部信息,如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-740239.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-740239.html
到了這里,關(guān)于《吐血整理》高級系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket數(shù)據(jù)包的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!