ホームページ  >  記事  >  バックエンド開発  >  Pythonネットワークプログラミングでデータを完全に受信するrecv関数の呼び出し方法3つを詳しく解説

Pythonネットワークプログラミングでデータを完全に受信するrecv関数の呼び出し方法3つを詳しく解説

高洛峰
高洛峰オリジナル
2017-03-27 15:07:242839ブラウズ

最近、ネットワークプログラミングpythonを使用して、ユニバーサルtcpclientテストガジェットを開発しています。ソケットを使用したネットワークプログラミングでは、相手が送信したメッセージが受信されたかどうかをどのように判断するかが、ソケットネットワークを開発する際に考慮しなければならない問題です。ここでは、データ受信の完了を判断するためによく使用される 3 つの方法を簡単に紹介します:

1. 基本的なデータ受信方法:

基本的なデータ受信方法を使用する場合、サービスソケットから切断するときに、空の 文字列 を受け取ります。したがって、この機能によれば、データ送信側がソケット接続を閉じるまでデータを受信し続けるループをプログラムに追加することができます。適用可能なシナリオ: クライアントとサーバー間のリンクは短いリンクです (つまり、1 つのソケット通信の後に接続が閉じられます)。 コードは以下の通りです:

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関数の呼び出し方法3つを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。