0%

python websockets全双工通信

python websockets全双工通信:

本文搬运自:https://blog.csdn.net/qq_42195302/article/details/120150438

功能描述:

客户端和服务端都可发送或接收数据。发送和接收相互独立,异步并发。


运行环境:

  • python3.6.8

  • websockets9.1


服务端:

import asyncio
import websockets

async def send(websocket):
while True:
await asyncio.sleep(1)
#此协程挂起1s,以切换到其他协程。不加此行不会切换到另一个协程。此处用time.sleep()不能起到这个作用。
#可以在此产生数据然后send出去。
await websocket.send("hello")
#正常地发送,不会切换到receive()
print("send hello")


async def receive(websocket):
while True:
await asyncio.sleep(1)
#此协程挂起1s,以切换到其他协程。不加此行不会切换到另一个协程。此处用time.sleep()不能起到这个作用。
greeting = await websocket.recv()
#正常地接收,不会切换到send()
print("receive "+greeting)


async def hello(websocket, path):
a = asyncio.get_event_loop().create_task(send(websocket))
b = asyncio.get_event_loop().create_task(receive(websocket))
#使用create_task()创建task

await a
await b
# ab并发
# ab并发,下面这行代码不会执行
print("wait")
#print("wait")不会执行

start_server = websockets.serve(hello, "localhost", 8766)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()



客户端:

import asyncio
import websockets

async def send(websocket):
while True:
await asyncio.sleep(1)
#此协程挂起1s,以切换到其他协程。不加此行不会切换到另一个协程。此处用time.sleep()不能起到这个作用。

await websocket.send("hello")
#正常地发送,不会切换到receive()

print("send hello")


async def receive(websocket):
while True:
await asyncio.sleep(1)
#此协程挂起1s,以切换到其他协程。不加此行不会切换到另一个协程。此处用time.sleep()不能起到这个作用。

greeting = await websocket.recv()
#正常地接收,不会切换到send()
print("receive"+greeting)


async def hello():
uri = "ws://localhost:8766"
async with websockets.connect(uri) as websocket:
a = asyncio.get_event_loop().create_task(send(websocket))
b = asyncio.get_event_loop().create_task(receive(websocket))
await a
await b
# ab并发,下面这行代码不会执行
print("wait")
#print("wait")不会执行

asyncio.get_event_loop().run_until_complete(hello())