2016-01-20 3 views
0

Я пытаюсь написать простой сканер. Но попытка прочитать ответ с сервера возвращает ответ только в первый раз. Затем читатель перестает читать байты и возвращает b ''. Я попытался установить тайм-аут и использовать дренаж() после записи. Это не принесло результатов. Wireshark показывает, что ответы приходят с сервера, но моя программа их не видит.Считыватель сокетов Asyncio возвращает пустые байты

import asyncio 

HOST = '93.184.216.34' 
PORT = 80 
CONCURRENT_CONNECTIONS = 3 

request = 'GET/HTTP/1.1\r\n' \ 
      'Host: example.com\r\n' \ 
      'Content-Type: application/x-www-form-urlencoded\r\n' \ 
      '\r\n'.encode() 


async def smart_read(reader): 
    buffer = b'' 
    while True: 
     response = await reader.read(1024) 
     if not response: 
      break 
     buffer += response 
    return buffer 


async def work(host, port, request): 
    reader, writer = await asyncio.open_connection(host, port) 
    while True: 
     writer.write(request) 
     resp = await smart_read(reader) 
     print(resp) 


tasks = [] 
for _ in range(CONCURRENT_CONNECTIONS): 
    tasks.append(asyncio.ensure_future(work(HOST, PORT, request))) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(asyncio.wait(tasks)) 
loop.close() 
+0

что цель 'время цикла true' в' work'? Удалите его и протестируйте – kwarunek

+0

Crawler отправит множество запросов в одном соединении. Это делается, например. В исходном коде я использую очередь для передачи ссылок. – CthUlhUzzz

+0

Рассмотрите возможность использования ['aiohttp'] (http://aiohttp.readthedocs.org/) для обхода в Интернете. –

ответ

0

После StreamReader достигает EOF, вы всегда получите b'', вы можете очистить _eof флаг читателя, но это Hacky. Подклассификация StreamReader для обработки многих запросов представляется разумным решением.

Quick 'п' грязный (на самом деле не использовать его)

async def work(host, port, request): 
    reader, writer = await asyncio.open_connection(host, port) 
    while True: 
     reader._eof = False # force to read 
     writer.write(request) 
     resp = await smart_read(reader) 
     print(resp) 
Смежные вопросы