我需要从广播服务器接收实时数据,这样做时,处理数据的某些部分会丢失。这是我尝试过的代码:
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 socket编程的新手。
答案 0 :(得分: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
请注意,此代码尚未经过测试;它也不是非阻塞套接字的选项。