33 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取WebSocket數據包

1.簡介本來打算再寫一篇這個系列的文章也要和小伙伴或者童鞋們說再見了,可是有人留言問WebSocket包和小程序的包不會抓,那就關于這兩個知識點宏哥就再水兩篇文章 。
2.什么是Socket?在計算機通信領域,socket 被翻譯為“套接字”(套接字=主機+端口號) , 它是計算機之間進行通信的一種約定或一種方式 。通過 socket這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據
socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read關閉close”模式來操作 。
我的理解就是Socket就是該模式的一個實現,它只是提供了一個針對TCP或者UDP編程的接口:即socket是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉) 。
socket抽象層在網絡中的位置圖解,如下圖所示:

33 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取WebSocket數據包

文章插圖
3.Socket通信流程Socket通信流程,如下圖所示:
33 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取WebSocket數據包

文章插圖
根據socket通信基本流程圖,總結通信的基本步驟:
服務器端:
第一步:創建一個用于監聽連接的Socket對像;
第二步:用指定的端口號和服務器的ip建立一個EndPoint對像;
第三步:用socket對像的Bind()方法綁定EndPoint;
第四步:用socket對像的Listen()方法開始監聽;
第五步:接收到客戶端的連接,用socket對像的Accept()方法創建一個新的用于和客戶端進行通信的socket對像;
第六步:通信結束后一定記得關閉socket;
客戶端:
第一步:建立一個Socket對像;
第二步:用指定的端口號和服務器的ip建立一個EndPoint對像;
第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為參數 , 向服務器發出連接請求;
第四步:如果連接成功 , 就用socket對像的Send()方法向服務器發送信息;
第五步:用socket對像的Receive()方法接受服務器發來的信息 ;
第六步:通信結束后一定記得關閉socket;
4.python實現一個客戶端與服務端的通信4.1函數Socket對象方法:服務端:
函數描述.bind()綁定地址關鍵字,AF_INET下以元組的形式表示地址 。常用bind((host,port)).listen()監聽TCP,可以掛起的最大連接數,該值至少為1,一般設為5即可.accept()被動接受TCP客戶端的連接客戶端: 函數描述.connect()初始化服務器連接.connect_ex()是對connect()函數的擴展,當出錯時返回出錯碼,不報異常其它函數: 函數描述.recv()接收數據,數據以字符串的形式返回,bufsize指定接收的最大數據量 。.send()發送數據,將string中的數據發送到連接的套接字,返回值是要發送的字節數量,通常使用.encode()函數對數據進行轉碼.senddall()發送完整的數據,在返回之前會嘗試發送所有數據,成功返回None,失敗則拋出異常 。.recvfrom()與recv()函數類似,不同的是返回值是(data,address),其中data是包含接收數據的字符串,address是發送數據的套接字地址 。.sendto()發送UDP數據 , 將數據發送到套接字,形式是(ipaddr,port)的元組 。.close()關閉套接字4.2服務端使用socket函數來創建一個socket對象,并設置一個socket服務,然后通過bind(hostname,port)函數來指定一個端口,使用socket對象的accept方法,等待客戶端的連接,并返回connection對象 。具體步驟為:
#創建服務端套接字serversocket=socket()#把地址綁定到套接字serversocket.bind()#對連接進行監聽serversocket.listen()#使用一個while進行循環,并接收客戶端的連接while True:serverclient=serversocket.accept()while True:#接收已發送serverclient.recv()serverclient.send()#關閉客戶端套接字serverclient.close()#關閉服務端套接字serversocket.close()4.3具體代碼實現實現功能:通過while實現循環接收客戶端發送的數據,并對客戶端發送的數據進行顯示并返回給客戶端數據,返回給客戶端的數據信息后加入時間戳 。新建一個文件server.py 。
import socketimport sysimport timeserversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostname()#獲取本地主機名port=9999#綁定端口號serversocket.bind((host,port))#設置最大連接數serversocket.listen(5)while True:print('服務器啟動,監聽客戶端鏈接')clientsocket,addr=serversocket.accept()print('鏈接地址:%s' % str(addr))while True:try:data=https://www.huyubaike.com/biancheng/clientsocket.recv(1024)except Exception:print('斷開的客戶端:',addr)breakprint('客戶端發送內容:',data.decode('utf-8'))reply=input('回復:').strip()if not reply:breakmsg=time.strftime('%Y-%m-%d %X')#獲取結構化時間戳msg1='[%s]:%s'% (msg,reply)clientsocket.send(msg1.encode('utf-8'))clientsocket.close()serversocket.close()

推薦閱讀