簡體   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