使用asyncio的Python简单套接字客户端服务器

使用asyncio的Python简单套接字客户端服务器,第1张

使用asyncio的Python简单套接字客户端/服务器

与线程代码最接近的文字翻译将像以前一样创建套接字,使其成为非阻塞

asyncio

套接字,并使用低级套接字 *** 作来实现服务器。这是一个示例,坚持使用更相关的服务器部分(客户端是单线程的,并且可能保持原样):

import asyncio, socketasync def handle_client(client):    request = None    while request != 'quit':        request = (await loop.sock_recv(client, 255)).depre('utf8')        response = str(eval(request)) + 'n'        await loop.sock_sendall(client, response.enpre('utf8'))    client.close()async def run_server():    while True:        client, _ = await loop.sock_accept(server)        loop.create_task(handle_client(client))server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(('localhost', 15555))server.listen(8)server.setblocking(False)loop = asyncio.get_event_loop()loop.run_until_complete(run_server())

以上方法有效,但不是预期的使用方式

asyncio
。这是非常低级的,因此容易出错,需要您记住在鞋e上设置适当的标志。另外,由于没有缓冲,因此从插座读取线之类的简单 *** 作就变得繁琐。这个API级别实际上只是用于替代事件循环实现者,这将提供
他们的 执行
sock_recv
sock_sendall
等等。

虽然正确的抽象将取决于应用程序,但是您可能至少要利用

asyncio.start_server
原始套接字而不使用原始套接字。这大大减少了代码的行数:

async def handle_client(reader, writer):    request = None    while request != 'quit':        request = (await reader.read(255)).depre('utf8')        response = str(eval(request)) + 'n'        writer.write(response.enpre('utf8'))        await writer.drain()    writer.close()loop = asyncio.get_event_loop()loop.create_task(asyncio.start_server(handle_client, 'localhost', 15555))loop.run_forever()

有关详细信息,请参见文档。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5630725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存