打印收到的服务器数据时出现问题

时间:2015-01-06 06:24:53

标签: python sockets printing

我有下一个问题:当我将此代码用于带有python asyncio库的EchoServer时

import asyncio


class EchoServer(asyncio.Protocol):

    def connection_made(self, transport):
        self.transport = transport

    def data_received(self, data):
        print('Message received: {}'.format(data.decode()), end='')
        self.transport.write(data + b'\n')

    def connection_lost(self, exc):
        print('Client disconnected...')


loop = asyncio.get_event_loop()
coro = loop.create_server(EchoServer, '127.0.0.1', 12345)
server = loop.run_until_complete(coro)
print('Listening on {}'.format(server.sockets[0].getsockname()))

try:
    loop.run_forever()
except KeyboardInterrupt:
    pass
finally:
    server.close()
    loop.close()

在这一行

print('Message received: {}'.format(data.decode()), end='')

当我使用:end=''时,来自没有'\n'的客户端的消息不会登录控制台,只会显示客户端断开连接时收到的消息。 像这样:

Message received: testMessage received: testMessage received: testClient disconnected...

仅当客户端断开连接时才会显示此消息。

但是当我在来自客户端的消息末尾使用'\n'时,当客户端发送消息时,消息会显示在控制台上。像这样:

Message received: test
Message received: test
Message received: test
client disconnected...

在这种情况下,在3个不同的时间内,最后客户端断开连接。 当我使用这一行时:

 print('Message received: {}'.format(data.decode()))

没有end='',可以在邮件末尾没有'\n'的客户端邮件中正常工作。

我想知道原因。

问题不在于控制台消息格式,问题是收到的数据显示在控制台中的时间。

PS:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

你应该手动刷新标准输出。

print('Message received: {}'.format(data.decode()), end='')
sys.stdout.flush()