Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用asyncio.start\u unix\u服务器和一个corutine发送的数据未完成_Python_Sockets_Coroutine - Fatal编程技术网

Python 使用asyncio.start\u unix\u服务器和一个corutine发送的数据未完成

Python 使用asyncio.start\u unix\u服务器和一个corutine发送的数据未完成,python,sockets,coroutine,Python,Sockets,Coroutine,我正在编写一些代码,以使用asyncio包(python 3.5和Unix系统)与两个进程进行通信 我使用以下服务器进程代码为该任务创建unix域套接字: factory = asyncio.start_unix_server(listen, SOCKET_ADDR) server = event_loop.run_until_complete(factory) event_loop.run_forever() 其中listen是一个接收数据并打印其长度的协同程序: async def lis

我正在编写一些代码,以使用asyncio包(python 3.5和Unix系统)与两个进程进行通信

我使用以下服务器进程代码为该任务创建unix域套接字:

factory = asyncio.start_unix_server(listen, SOCKET_ADDR)
server = event_loop.run_until_complete(factory)
event_loop.run_forever()
其中listen是一个接收数据并打印其长度的协同程序:

async def listen(reader, writer):
    data_stream = await reader.read()
    writer.close()
    print(len(data_stream))
客户端进程仅连接到该套接字并发送二进制字符串:

# Coroutine that sends a binary string
async def send_data(socket_address):
    _, writer = await asyncio.open_unix_connection(socket_address)
    datastream = b'fooo'*18*1024
    print(len(datastream))
    writer.write(datastream)
    await writer.drain()
    writer.close()

# Connect to the socket and send the data
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(send_data(SOCKET_ADDR))
我不明白为什么客户端生成的数据流的大小与服务器接收的数据流的大小不同。事实上,我总是得到相同的结果,所以我认为它不是随机的。以下是我得到的不同结果:

datastream = b'fooo'*4*1024 --> Client-length 16384 // Server-length 16384 (Correct)
datastream = b'fooo'*5*1024 --> Client-length 20480 // Server-length 16384 (Uncompleted)
datastream = b'fooo'*18*1024 --> Client-length 73728 // Server-length 16384 (Uncompleted)
datastream = b'fooo'*19*1024 --> Client-length 77824 // Server-length 73728 (Uncompleted)

我错过了什么?谢谢

您的写入卡在客户端的缓冲区中(
writer.transport.\u buffer
)。我不明白应该怎么冲洗。作为一种解决方法,您可以在排空后睡觉(例如,
等待asyncio.sleep(.1)
),您是对的!我试着睡觉,结果成功了。然而,我想要一个更健壮的解决方案。最后,我所做的是等待服务器端的ack响应,这样就可以了。@jcozar87您找到了更有效的解决方案吗?两年以上