[英]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.