使用socket.recv(pack_length)接收不定長的資料,如果資料包長度超過一定值,則接收的資料不全,同時還會多觸發一次 socket.recv().
參照python3.4的文檔可發現:
<dl></dl>
<dt>socket.recv(bufsize[, flags]) </dt>
<dd></dd>
Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by bufsize.
上述的英文的大體意思為:從socket中接收資料。傳回值是byts類型。接收的最大數量的byte為指定的bufsize.
執行
bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
得到電腦上的預設接收緩沖區的值為:8192
問題場景描述:
server端是erlang實作的,client端是Python3實作的,通訊協定為自定義的格式,每次互動的資料包都是不定長的資料包。
從server端取資料,因為沒有指定查詢條件,傳回的資料的資料量在1000條左右,每一條的資料都包含多個的整數型和字元串型,byte大小為:26782。
如果取得的資料量比較多,每一次的請求資料,client 的socket.recv(packet_size)會執行多次。
解決方案:
個人注解:
Python的socket一次最多隻能讀出緩沖區的全部的資料,如果指定的資料包的大小大于緩沖區的大小,則讀出的有效資料僅僅為緩沖區的資料。
如果能确定發送過來的資料大于緩沖區的大小,則需要多次:socket.recv(receiverBufsize),然後将收到的資料拼接成完整的資料包後再解析。
二次錯誤修正:
使用上邊的解決方案,在收到較大的資料的時候,偶爾會出現 :
一個資料包讀出來了,但是資料包的較靠後的一部分資料有問題,将資料包解析後發現隻有前邊的部分能正确解析、後邊的部分解析出來全是無效的資料。同時還會多觸發幾次 socket.recv().
緩沖區,bufsize: 8192
下列的兩個值是我電腦傳輸特定的資料包的時候的值:
pack_length :26782
body_part_length: 24460
熱鬧了,。。。。。函數api有問題
二次解決方案:
手動點選測試 :至少在五分鐘内的連續點選測試并沒有出現第一次的解決方案的的部分資料無效的情況。
未能确定出錯的原因,個人猜測:對緩沖區的讀資料盡量少次數的讀吧。。。。。。