繁体   English   中英

Python套接字服务器和客户端在一个脚本中

[英]Python sockets server and client in one script

我有一个看似简单的任务,我无法完全动脑筋。 这是我需要做的。 使用套接字模块,启动服务器,使用客户端启动连接,停止服务器,返回连接数据-全部在一个脚本中。 当我从两个终端运行两者时,可以做到这一点,但是我需要将服务器和客户端代码都放在一个脚本中以实现自动化。 我的问题是socket.accept()是一个阻塞调用,并且脚本在我可以调用客户端之前挂起。 尝试使用socket.setblocking(False)玩,但它仍然会阻塞。 我凭直觉感到我可以使用asyncio模块来完成此任务,但是我对此没有经验,我所看到的示例似乎不适合我的任务。 非常感谢。

我需要将服务器和客户端代码都放在一个脚本中以实现自动化。 我的问题是socket.accept()是一个阻塞调用,并且脚本在我可以调用客户端之前挂起。 [...]我凭直觉感到我可以使用asyncio模块来完成此任务

实际上,Asyncio使得“后台”(请参阅asyncio.create_task )或“并行”(请参阅asyncio.gather )启动多个任务变得容易。

实际上,由于start_server API首先在“后台”运行服务器(某种程度上是服务器如何分叉以使其自身进行守护进程,并且从shell启动时不必添加& ),所以不必甚至需要做一些特殊的事情来并行启动客户端和服务器-只需启动服务器,等待客户端协程,然后停止服务器即可。

例如,从文档中的echo客户/服务器示例开始,我很快就得出了这样的信息:

import asyncio

async def connect():
    print('connecting...')
    reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
    writer.write(b'hello world')
    data = await reader.read(100)
    assert data == b'hello world'
    writer.close()
    await writer.wait_closed()
    print('closed connection')
    return data

async def handle_client(reader, writer):
    print('incoming connection')
    while True:
        data = await reader.read(100)
        if data == b'':
            break
        writer.write(data)
        await writer.drain()
    print('incoming connection closed')

async def main():
    server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)
    print('server now set up')
    await connect()
    server.close()
    await server.wait_closed()

asyncio.run(main())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM