2017-06-05 8 views
0

ブロードキャストサーバーからリアルタイムデータを受信する必要があります。その際、データの一部が処理中に欠落しています。ここで私が試したコードは次のとおりです。Pythonソケットを使用してブロードキャストサーバーから大きなデータを受信する方法

import socket 
import sys 
from pymongo import MongoClient 

def process(): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    # Connect the socket 
    server_address = ('ip', port) 
    print('connecting to %s port %s' % server_address) 
    sock.connect(server_address) 

    try: 
     # Look for the response 

     while True: 
       data = sock.recv(16384000) 
       #print(data) 
       if not data: 
       pass 
       else: 
        print data 
    except socket.error, ex: 
     print('closing socket') 
     sock.close() 
     time.sleep(1) 
     process() 
     #def fun(data): 
     #print data[0] 

私は、任意のデータを失うことなく、完全なデータを受け取ったかどうかを確認する方法を理解していません。この問題を解決するために私を助けてください。私は非常にPythonのソケットプログラミングに新しいです。

答えて

0

通常、受信呼び出しは、要求された量の受信を待つのではなく、要求された量まで利用可能なすべてのデータを返します。正確に16384000バイトのデータを確実に受信したい場合は、それを自分で実装する必要があります。 TCP doesn't preserve message boundaries。だから実際には次のようなものが欲しいのです:

def recvall(sock, length): 
    data = b'' 
    while length: 
     recved = sock.recv(length) 
     data += recved 
     length -= len(recved) 
    return data 

このコードはテストされていませんのでご注意ください。非ブロック型ソケットのオプションでもありません。

関連する問題