Я пытаюсь написать простой сканер. Но попытка прочитать ответ с сервера возвращает ответ только в первый раз. Затем читатель перестает читать байты и возвращает 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()
что цель 'время цикла true' в' work'? Удалите его и протестируйте – kwarunek
Crawler отправит множество запросов в одном соединении. Это делается, например. В исходном коде я использую очередь для передачи ссылок. – CthUlhUzzz
Рассмотрите возможность использования ['aiohttp'] (http://aiohttp.readthedocs.org/) для обхода в Интернете. –