2014-09-20 2 views
0

Я использую разъем для подключения к простому серверу, чтобы получить некоторые данные:Получить все данные при использовании питона сокета

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
host = "X.X.X.X" 
port = Y 
s.connect((host,port)) 

data = s.recv(512) 
print data 

Не все ожидаемые полученных данные принимаются; некоторые из них отрезаны. Поэтому любые операции, которые мне нужно выполнить на полученных данных, отбрасываются.

Я пробовал использовать s.settimeout(1) и помещать сокет в неблокирующий режим. Как ни странно, он отлично работает в ipython.

+1

использовать петлю для считывания до тех пор, пока соединение не будет закрыто другой стороной. Или создайте простой протокол, в котором вы отправляете количество байтов для чтения, а затем читаете в цикле, пока не получите столько байтов. – JBernardo

ответ

1

Даже если 512 байтов отправляются с сервера на клиент, если они отправляются через несколько пакетов и что один пакет имеет флаг TCP Push, ядро ​​прекращает буферизацию и передает данные пользователю, т. Е. , ваше приложение.

Вы должны закодировать данные = s.recv (512) и распечатать данные. Я бы даже удалил «512», что бесполезно.

while True: 
    if not data: break 
    data = s.recv() 
    print data 
Смежные вопросы