Прочитать весь текст из socket asyncio
Server Этот код ждет только 1024 байт, потому что больше - не работает:
import asyncio
async def handle_client(reader, writer):
data = await reader.read(1024)
data2 = await reader.read(1024)
writer.write("hello from server".encode())
await writer.drain()
writer.close()
loop = asyncio.get_event_loop()
loop.create_task(asyncio.start_server(handle_client, 'localhost', 4782))
loop.run_forever()
Client Генерация 1024байтов и отправка:
import socket
sock = socket.socket()
sock.connect(('localhost', 4782))
sock.sendall(("".join([str(i)[-1:] for i in range(1024)])).encode())
data = sock.recv(1024)
sock.close()
Проблема: сервер замораживает клиент из-за того, что ждет еще 1024 байтов, в библиотеке socket возвращает просто b'', тут же, я не разобрался как это сделать, прошу о помощи.
Ответы (1 шт):
Автор решения: eri
→ Ссылка
b'' не всегда обозначает конец передачи особенно если передача не законченна. Для потоков надо обозначить конец передачи обрывом соединения или изобретайте протокол на TLV.
Поведение с которое Вы хотите в асинкио можно получить с помошью протоколов:
import asyncio
class EchoServerProtocol(asyncio.Protocol):
def connection_made(self, transport):
self.transport = transport
def data_received(self, data):
message = data.decode() # -- пакет прилетевший с sendall, уже эвейтнутый
self.transport.write("hello from server".encode())
self.transport.close()
async def main():
# Get a reference to the event loop as we plan to use
# low-level APIs.
loop = asyncio.get_running_loop()
server = await loop.create_server(
lambda: EchoServerProtocol(),
'127.0.0.1', 4782)
async with server:
await server.serve_forever()
asyncio.run(main())
Но при больших объемах лучше использовать стримы.