最近、ネットワークプログラミングに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('>i', 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 ''.join(total_data)
以上がPythonネットワークプログラミングでデータを完全に受信するrecv関数の呼び出し方法3つを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。