Python 3.6 asyncio发送json消息错误

时间:2018-01-24 09:09:27

标签: json python-3.x python-asyncio

我正在尝试设置可以使用JSON格式交换消息的TCP echo客户端和服务器。

我从documentation获取了代码,并将其修改如下:

编辑包含修复程序,让服务器和客户端都发送JSON样式的消息。

import asyncio
# https://docs.python.org/3/library/asyncio-stream.html
import json  

async def handle_echo(reader, writer):
    data = await reader.read(100)
    message = json.loads(data.decode())
    addr = writer.get_extra_info('peername')
    print("Received %r from %r" % (message, addr))

    print("Send: %r" % json.dumps(message))  # message

    json_mess_en = json.dumps(message).encode()
    writer.write(json_mess_en)
    #writer.write(json_mess)  # not wokring
    #writer.write(json.dumps(json_mess))  # not working

    # Yielding from drain() gives the opportunity for the loop to schedule the write operation
    # and flush the buffer. It should especially be used when a possibly large amount of data
    # is written to the transport, and the coroutine does not yield-from between calls to write().
    #await writer.drain()

    #print("Close the client socket")
    writer.close()

loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '0.0.0.0', 9090, loop=loop)
server = loop.run_until_complete(coro)

# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

和客户端代码:

import asyncio
import json


async def tcp_echo_client(message, loop):
    reader, writer = await asyncio.open_connection('0.0.0.0', 9090,
                                                   loop=loop)

    print('Send: %r' % message)
    writer.write(json.dumps(message).encode())

    data = await reader.read(100)
    data_json = json.loads(data.decode())
    print('Received: %r' % data_json)
    print(data_json['welcome'])

    print('Close the socket')
    writer.close()


message = {'welcome': 'Hello World!'}
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop))
loop.close()

错误

TypeError: data argument must be a bytes-like object, not 'str'

我应该使用除writer.write之外的其他函数来编码JSON吗?还是有什么建议吗?

1 个答案:

答案 0 :(得分:1)

找到解决方案,替换:

writer.write(json.dumps(json_mess))

# encode as 'UTF8'
json_mess_en = json.dumps(json_mess).encode()
writer.write(json_mess_en)