【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()

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())

其实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)

send数据

async def producer_handler(websocket, path):
    while True:
        message = await producer()
        await websocket.send(message)

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值