2017-06-05 44 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 

請注意,此代碼尚未經過測試;它也不適用於非阻塞套接字。