Почему StreamReader не может записать в этот код? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть вопрос по поводу StreamReader / StreamWriter.

Чтобы упростить мой фактический код, как и следующий код (они могут выполняться). После запуска сервера запустите клиент, чтобы запросить его. Сервер не будет читать никаких данных

Код сервера:

import asyncio

loop = asyncio.get_event_loop()


async def log(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
    print("Wait read")
    data = await reader.read(-1)
    print("<:", data)
    writer.write(data)
    await writer.drain()
    print(">:", data)


async def link(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
    asyncio.run_coroutine_threadsafe(log(reader, writer), loop)
    print("Connect.")
    await asyncio.sleep(1)


loop.run_until_complete(
    asyncio.start_server(
        link, "0.0.0.0", 1080, loop=loop
    )
)
loop.run_forever()

Код клиента:

import socket
import traceback

try:
    sock = socket.create_connection(("127.0.0.1", 1080))
    sock.sendall(b"Hello")
    print(sock.recv(1024))
    sock.close()
except socket.error:
    traceback.print_exc()

Я знаю, как решить эту проблему, но я хочу знать, почему эта проблема возникает.

1 Ответ

0 голосов
/ 05 ноября 2018

В соответствии с документацией :

StreamReader.coroutine чтение (n = -1)

Читать до n байтов. Если n не задано или установлено в -1, читать до EOF и возвращать все прочитанные байты.

Если получен EOF и внутренний буфер пуст, вернуть пустой объект байтов.

Ваша программа ожидает вызова data = await reader.read(-1). reader.read(-1) возвращается только тогда, когда он получает EOF (конец файла). Другими словами, это означает, что он вернется, когда другая сторона (клиент) закроет сокет.

Вы можете попробовать поэкспериментировать и закомментировать эту строку print(sock.recv(1024)) в коде клиента, и вы увидите, что data = await reader.read(-1) возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...