Skip to main content

一个 Python 3 异步数据报库

项目描述

jetblack 数据报

用于 UDP 数据报客户端和服务器的 Python 3.8+ asyncio 帮助程序库。

地位

这是有效的,但仍在持续开发中,因此可能会有重大变化。

概述

这个包为 UDP 数据报提供了一个简单的异步 API,遵循与 TCP 流 API 类似的模式。

UDP服务器通过调用来启动,start_udp_server类似于 . 这将返回 a ,它提供读取 ( )、写入 ( ) 和关闭 ( and ) 的方法。这与 TCP 变体不同,后者在客户端连接读写流时提供回调。这是因为 UDP 是无连接的,因此没有连接(或断开连接)事件。数据也是以数据包的形式发送和接收的,因此提供单独的读写流似乎没有任何好处。asyncioDatagramServerreadsendtoclosewait_closed

下面创建一个服务器,读取然后写入一些数据。

server = await start_udp_server(('0.0.0.0', 8000))

data, addr = await server.recvfrom()
print(f"Received {data} from {addr}")
server.sendto(b"Hello", addr)

server.close()
await server.wait_closed()

通过调用open_udp_connection类似于库为 TCP 提供的 open_connection 函数来启动 UDP 客户端,该函数asyncio返回一个DatagramClient. 这为服务器提供了类似的功能,但是addr在读取或写入时不存在,因为套接字在创建时绑定到服务器地址。

client = await open_udp_connection(('127.0.0.1', 8000))

client.send(b"Hello, World!")
data = await client.recv()
print(f"Received {data}")

client.close()
await client.wait_closed()

安装

使用 pip 安装。

pip install jetblack-datagram

入门

创建回显服务器:

import asyncio

from jetblack_datagram import start_udp_server


async def main():
    server = await start_udp_server(('127.0.0.1', 9999))

    count = 0
    while count < 5:
        count += 1
        print("Reading")
        data, addr = await server.recvfrom()
        print(f"Received {data!r} from {addr}")
        print(f"Send {data!r} to {addr}")
        server.sendto(data, addr)

    print("Closing")
    server.close()
    print("Waiting for server to close")
    await server.wait_closed()
    print("Closed")

    print("Done")

if __name__ == '__main__':
    asyncio.run(main())

创建回显客户端:

import asyncio

from jetblack_datagram import open_udp_connection


async def main():
    client = await open_udp_connection(('127.0.0.1', 9999))

    print("Sending data")
    client.send(b"Hello, World!")
    print("reading data")
    data = await client.recv()
    print(f"Received {data!r}")

    print("closing client")
    client.close()
    print("waiting for client to close")
    await client.wait_closed()


if __name__ == '__main__':
    asyncio.run(main())

用法

UDP 协议是无连接的,因此与 TCP 不同,为每个服务器连接提供读取器或为连接提供回调是没有意义的。

常见的

以下方法对客户端和服务器都是通用的。

  • 关闭()-> 无
  • 异步 wait_closed() -> 无

服务器

以下方法特定于服务器。

  • sendto(data: bytes, addr: Union[Address, str]) -> 无
  • async recvfrom() -> 元组[字节,地址]

客户

以下方法特定于客户端。

  • 发送(数据:字节)-> 无
  • 异步 recv() -> 字节

帮手

有一个助手来创建服务器和客户端。

对于服务器:

async def start_udp_server(
        addr: Address,
        *,
        loop: Optional[AbstractEventLoop] = None,
        maxreadqueue: int = 0
) -> DatagramServer:

对于客户:

async def open_udp_connection(
        addr: Address,
        *,
        loop: Optional[AbstractEventLoop] = None,
        maxreadqueue: int = 0
) -> DatagramClient:

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

jetblack-datagram-0.4.1.tar.gz (8.7 kB 查看哈希)

已上传 source

内置分布

jetblack_datagram-0.4.1-py3-none-any.whl (8.7 kB 查看哈希)

已上传 py3