Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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套接字服务器和客户端_Python_Sockets_Python Asyncio - Fatal编程技术网

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

一个脚本中的Python套接字服务器和客户端,python,sockets,python-asyncio,Python,Sockets,Python Asyncio,我有一个看起来很简单的任务,我不能完全集中我的头脑。 这是我需要做的。使用socket模块,启动服务器,使用客户端启动连接,停止服务器,返回连接数据-所有这些都在一个脚本中完成。当我从两个终端运行这两个终端时,我可以做到这一点,但我需要将服务器和客户端代码放在一个脚本中以实现自动化。我的问题是socket.accept()是一个阻塞调用,脚本在我调用客户端之前挂起。尝试使用socket.setblocking(False)进行播放,但仍会被阻止。我直觉上觉得我可以用asyncio模块来完成这一点

我有一个看起来很简单的任务,我不能完全集中我的头脑。 这是我需要做的。使用socket模块,启动服务器,使用客户端启动连接,停止服务器,返回连接数据-所有这些都在一个脚本中完成。当我从两个终端运行这两个终端时,我可以做到这一点,但我需要将服务器和客户端代码放在一个脚本中以实现自动化。我的问题是socket.accept()是一个阻塞调用,脚本在我调用客户端之前挂起。尝试使用socket.setblocking(False)进行播放,但仍会被阻止。我直觉上觉得我可以用asyncio模块来完成这一点,但我没有使用它的经验,而且我看到的示例似乎不适合我的任务。多谢

我需要将服务器和客户端代码放在一个脚本中以实现自动化。我的问题是,
socket.accept()
是一个阻塞调用,脚本在我调用客户端之前挂起。[…]我直觉上觉得我可以通过asyncio模块来实现这一点

Asyncio确实可以轻松地“在后台”(请参阅)或“并行”(请参阅)启动多个任务

事实上,由于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())
我需要将服务器和客户端代码放在一个脚本中以实现自动化。我的问题是,
socket.accept()
是一个阻塞调用,脚本在我调用客户端之前挂起。[…]我直觉上觉得我可以通过asyncio模块来实现这一点

Asyncio确实可以轻松地“在后台”(请参阅)或“并行”(请参阅)启动多个任务

事实上,由于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())

您可以尝试使用线程。一个用于服务器,一个用于客户端。简言之,线程就像独立运行的程序,你可以尝试使用线程。一个用于服务器,一个用于客户端。简言之,线程就像独立运行的程序。我的客户端位于不同的主机上,我无法使用本机start_服务器,因为我正在测试ssl套接字,所以我需要套接字和ssl上下文。我正在看另一个示例,它允许使用套接字,但是如果客户机位于不同的主机上,那么仍然可以处理asyncio吗?非常感谢。@postoronnim
start\u server
支持SSL(请参阅,这应该不是问题。我不理解“客户端位于不同主机上”这一部分,因为它似乎与服务器和客户端“位于同一脚本中”的要求背道而驰问题中根本没有提到。到客户端的控制台连接已经存在,因此每当需要时,我都可以调用客户端,例如启动\u tls\u session()。@postoronnim什么是“到客户端的控制台连接”?答案显示了如何在单个脚本中设置服务器并连接到服务器,这是问题中提出的目标。如果您的目标是其他目标,请编辑问题并描述它,以便您的问题能够得到实际回答。我的客户端位于不同的主机上,我无法使用本机start\u服务器,因为我正在测试ssl sockets,所以我需要套接字和ssl上下文。我正在看另一个示例,它允许使用套接字,但是如果客户端位于不同的主机上,是否仍然可以处理异步IO?非常感谢。@postoronnim
start\u server
支持ssl(请参阅,这应该不是问题。我不理解“客户端位于不同主机上”这一部分,因为这似乎与服务器和客户端“位于同一个脚本中”的要求背道而驰问题中根本没有提到。到客户端的控制台连接已经存在,因此每当需要时,我都可以调用客户端,例如启动\u tls\u session()。@postoronnim什么是“到客户端的控制台连接”?答案显示了如何在单个脚本中设置服务器并连接到服务器,这是问题中提出的目标。如果您的目标是其他目标,请编辑问题并进行描述,以便您的问题能够得到实际回答。