我有一个let closure1 = { (a:String) in print(a)}
let closure2 = closure1
if closure1 as AnyObject === closure2 as AnyObject {
print("success")
}
,这是TCP Doc的一个例子。但是我使用asyncio server
连接到它,当服务器上的阅读器尝试读取时,我得到一个解码错误。任何提示都受到高度赞赏。我已经尝试过首先编码到utf-8,没有帮助。
服务器:(Python 3.6)
pyzmq
客户端:(Python 2.7)
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
print(data)
message = data.decode()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 5555, loop=loop)
server = loop.run_until_complete(coro)
loop.run_forever()
完整跟踪:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:%s" % 5555)
socket.send("test")
答案 0 :(得分:4)
Zeromq使用ZMTP protocol。它是一个二进制协议,因此您无法直接解码它。
如果您对此感到好奇,请使用wireshark和ZMTP plugin检查ZMTP帧:
您可以看到您获得的字节实际上与问候留言签名相对应。
要从asyncio中的ZMQ套接字接收消息,请使用aiozmq之类的专用项目:
import aiozmq
import asyncio
async def main(port=5555):
bind = "tcp://*:%s" % port
rep = await aiozmq.create_zmq_stream(aiozmq.zmq.REP, bind=bind)
message, = await rep.read()
print(message.decode())
rep.write([message])
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
答案 1 :(得分:3)
字节ff
是小端UTF-16 BOM的第一个字节,它在UTF-8流中没有位置,其中代码点开头的最大1位数是4。
有关UTF-8编码的详细信息,请参阅earlier answer of mine。
至于修复它,你需要接收发送的内容。这将涉及固定发送端进行UTF-8,或接收侧进行UTF-16。
您可能希望了解Python 2和3中字符串之间的差异,这可能是导致您出现问题的原因(请参阅here)。