Python 如何通过异步IO套接字发送列表
我可以轻松地将消息从服务器发送到一个连接的客户端,您可以在我的代码Python 如何通过异步IO套接字发送列表,python,python-3.x,sockets,client-server,python-asyncio,Python,Python 3.x,Sockets,Client Server,Python Asyncio,我可以轻松地将消息从服务器发送到一个连接的客户端,您可以在我的代码writer.write((“您写:”).encode('utf8')+response.encode('utf8'))中看到它。 但是,例如,如何通过异步IO套接字发送列表/数组/矩阵?在下面的示例中,如何将hi列表发送到一个连接的客户端。。。我试着只写一个writer.write(hi.encode('utf8')),但它不起作用 import asyncio hi=[1, 2, 3, 4] @asyncio.corout
writer.write((“您写:”).encode('utf8')+response.encode('utf8'))中看到它。
但是,例如,如何通过异步IO套接字发送列表/数组/矩阵?在下面的示例中,如何将hi
列表发送到一个连接的客户端。。。我试着只写一个writer.write(hi.encode('utf8')),但它不起作用
import asyncio
hi=[1, 2, 3, 4]
@asyncio.coroutine
def handle_client(reader, writer):
request = None
response = ""
word=""
while word != 'quit' and request != b'':
request = (yield from reader.read(255))
if str(b'\r\n') == str((request)[-2:]) and len(request) > 2:
response=str((request.decode('utf8'))).rstrip()
request=str(b'\r\n')
if str(b'\r\n') == str(request):
word=response
response = response + str('\n\r')
writer.write(("you write: ").encode('utf8') + response.encode('utf8'))
response =""
addr = writer.get_extra_info('peername')
print("I get: " + word)
print(addr)
else:
response = response + str((request.decode('utf8')))
yield from writer.drain()
writer.close()
loop = asyncio.get_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(asyncio.start_server(handle_client, '127.0.0.1', 4312))
loop.run_forever()
在提供的示例中,
hi
是一个列表类型的对象,因此它没有encode()
方法。writer也是一个类型对象,其write()
方法需要一个bytes
类型对象。这意味着对象->字节编码必须由write()
方法的调用方处理。此外,数据的接收者必须在其一端执行字节->列表解码。要回答您的直接问题,您需要以通信两端都同意并理解的方式序列化数据。两个选项可以是,例如:
- JSON:
要获取
,您可以通过以下方式发送和接收:字节
对于您的示例来说,这似乎已经足够了,并且确实有一个优势,即传递的数据对人类来说也是可读的received = json.loads(response)
- 泡菜:
这也会产生
您可以在接收端反序列化:字节
这是一种更通用的方法,也可以用于无法用JSON序列化的类型received = pickle.loads(response)
str
调用,而且它们可能对您弊大于利(例如,str(b“a”)
是“b'a'”
),这与您的问题无关,但建议避免在新代码中使用@asyncio.coroutine
修饰符和屈服,自Python3.8以来,它们一直保持不变,并宣布将在Python3.10中删除。定义一个async def
,改为使用await
,这两个版本都是从Python 3.5(2015年发布)开始提供的。
import pickle
pickle.dumps(hi)
received = pickle.loads(response)