Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 如何通过异步IO套接字发送列表_Python_Python 3.x_Sockets_Client Server_Python Asyncio - Fatal编程技术网

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)
    
    对于您的示例来说,这似乎已经足够了,并且确实有一个优势,即传递的数据对人类来说也是可读的
  • 泡菜: 这也会产生
    字节
    您可以在接收端反序列化:
    received = pickle.loads(response)
    
    这是一种更通用的方法,也可以用于无法用JSON序列化的类型

您不能通过套接字发送任意对象,只能发送字节。您需要将列表序列化为另一端需要反序列化的格式。此外,您可能不需要任何这些
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)