与线程代码最接近的文字翻译将像以前一样创建套接字,使其成为非阻塞
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()
有关详细信息,请参见文档。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)