首頁  >  文章  >  後端開發  >  詳解python網路程式設計呼叫recv函數完整接收資料的三種方法

詳解python網路程式設計呼叫recv函數完整接收資料的三種方法

高洛峰
高洛峰原創
2017-03-27 15:07:242838瀏覽

  最近在使用python進行網路程式設計開發一個通用的tcpclient測試小工具。在使用socket進行網路程式設計中,如何判定對端發送一條封包是否接收完成,是進行socket網路開發必須要考慮的問題。這裡,簡單介紹一下判別資料接收完成常用的三種方法:

  1.基礎資料接收法:

   使用基礎資料接收法時,當與服務socket斷開連線時,會接收到空字串。因此,可以根據此特點,在程式中加入循環,一直接收數據,直到數據發送端關閉socket連接。適用場景:客戶端和伺服器的連結為短連結(即一次socket通訊後連線就會關閉)。 程式碼如下:

import socket,struct,sys,time

Port=22220
#assume a socket disconnect (data returned is empty string) means  all data was #done being sent.
def recv_basic(the_socket):
    total_data=[]
    while True:
        data = the_socket.recv(20480)    
        if not data: break
        total_data.append(data)
    return ''.join(total_data)

  2.尾標識方法

   透過尋找接收的協定資料中的尾標識字串,取得完整的資料的資料報文。適用場景:接收的協定資料中包含相關的尾標識。程式碼如下:

End='something useable as an end marker'
def recv_end(the_socket):
    total_data=[];data=''
    while True:
            data=the_socket.recv(8192)
            if End in data:
                total_data.append(data[:data.find(End)])
                break
            total_data.append(data)
            if len(total_data)>1:
                #check if end_of_data was split
                last_pair=total_data[-2]+total_data[-1]
                if End in last_pair:
                    total_data[-2]=last_pair[:last_pair.find(End)]
                    total_data.pop()
                    break
    return ''.join(total_data)

  3.負載長度方法

     即透過協定資料中的負載長度值,確定有效封包的長度,適用場景:協定資料中包含負載協定欄位。這種方法也是比較常用且通用的方法,但是需要一邊接收資料一邊解析資料。程式碼如下: 

def recv_size(the_socket):
    #data length is packed into 4 bytes
    total_len=0;total_data=[];size=sys.maxint
    size_data=sock_data='';recv_size=8192
    while total_len<size:
        sock_data=the_socket.recv(recv_size)
        if not total_data:
            if len(sock_data)>4:
                size_data+=sock_data
                size=struct.unpack(&#39;>i&#39;, size_data[:4])[0]
                recv_size=size
                if recv_size>524288:recv_size=524288
                total_data.append(size_data[4:])
            else:
                size_data+=sock_data
        else:
            total_data.append(sock_data)
        total_len=sum([len(i) for i in total_data ])
    return &#39;&#39;.join(total_data)

以上是詳解python網路程式設計呼叫recv函數完整接收資料的三種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn