当前位置:   article > 正文

【python】websockets_python websockets官方文档

python websockets官方文档

websockets官方文档
初步入门可以先看这个大致了解Python3+WebSockets实现WebSocket通信

现在越发觉得学一个东西还是得看官方文档,讲的细,很多一般博客没说明白的地方官方文档都会说明(其实基本95%的博客也都是从官方文档抄代码,阉割一部分内容给你看的,比如我这篇)

1、服务器端demo

#!/usr/bin/env python

# WS server example

import asyncio
import websockets

async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")

    greeting = f"Hello {name}!"

    await websocket.send(greeting)
    print(f"> {greeting}")

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

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

websockets每检测到有一个WebSocket连接都会执行一次协程hello。当协程执行完毕,这个连接也被close关闭了。

2、客户端demo

#!/usr/bin/env python

# WS client example

import asyncio
import websockets

async def hello():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

asyncio.get_event_loop().run_until_complete(hello())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

其实async with在这里的用法和with open(file)挺类似的,这里使用websockets.connect作为一个异步上下文管理器,来确保协程hello退出时,websockets的连接也被关闭。这种写法也是官方推荐的在客户端正确关闭一个连接的写法。

3、循环send、recv数据的demo

recv数据

async def consumer_handler(websocket, path):
    async for message in websocket:
        await consumer(message)
  • 1
  • 2
  • 3

send数据

async def producer_handler(websocket, path):
    while True:
        message = await producer()
        await websocket.send(message)
  • 1
  • 2
  • 3
  • 4

recv、send数据

async def handler(websocket, path):
    consumer_task = asyncio.ensure_future(
        consumer_handler(websocket, path))
    producer_task = asyncio.ensure_future(
        producer_handler(websocket, path))
    done, pending = await asyncio.wait(
        [consumer_task, producer_task],
        return_when=asyncio.FIRST_COMPLETED,
    )
    for task in pending:
        task.cancel()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/85355
推荐阅读
相关标签
  

闽ICP备14008679号