asyncio-dgram


Nameasyncio-dgram JSON
Version 2.2.0 PyPI version JSON
download
home_pagehttps://github.com/jsbronder/asyncio-dgram
SummaryHigher level Datagram support for Asyncio
upload_time2024-05-08 19:21:49
maintainerNone
docs_urlNone
authorJustin Bronder
requires_python>=3.6
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![Build Status](https://github.com/jsbronder/asyncio-dgram/workflows/ci/badge.svg)](https://github.com/jsbronder/asyncio-dgram/actions)

# Higher level Datagram support for Asyncio
Simple wrappers that allow you to `await read()` from datagrams as suggested
by Guido van Rossum
[here](https://github.com/python/asyncio/pull/321#issuecomment-187022351).  I
frequently found myself having to inherit from `asyncio.DatagramProtocol` and
implement this over and over.

# Design
The goal of this package is to make implementing common patterns that use datagrams
simple and straight-forward while still supporting more esoteric options.  This is done
by taking an opinionated stance on the API that differs from parts of asyncio.  For instance,
rather than exposing a function like
[create\_datagram\_endpoint](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint)
which supports many use-cases and has conflicting parameters, `asyncio_dgram`
only provides three functions for creating a stream:

- `connect((host, port))`: Creates a datagram endpoint which can only
  communicate with the endpoint it connected to.
- `bind((host, port))`: Creates a datagram endpoint that can communicate
  with anyone, but must specified the destination address every time it
  sends.
- `from_socket(sock)`: If the above two functions are not sufficient, then
  `asyncio_dgram` simply lets the caller setup the socket as they see fit.


# Example UDP echo client and server
Following the example of asyncio documentation, here's what a UDP echo client
and server would look like.
```python
import asyncio

import asyncio_dgram


async def udp_echo_client():
    stream = await asyncio_dgram.connect(("127.0.0.1", 8888))

    await stream.send(b"Hello World!")
    data, remote_addr = await stream.recv()
    print(f"Client received: {data.decode()!r}")

    stream.close()


async def udp_echo_server():
    stream = await asyncio_dgram.bind(("127.0.0.1", 8888))

    print(f"Serving on {stream.sockname}")

    data, remote_addr = await stream.recv()
    print(f"Echoing {data.decode()!r}")
    await stream.send(data, remote_addr)

    await asyncio.sleep(0.5)
    print(f"Shutting down server")


def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.gather(udp_echo_server(), udp_echo_client()))


if __name__ == "__main__":
    main()
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/jsbronder/asyncio-dgram",
    "name": "asyncio-dgram",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": null,
    "author": "Justin Bronder",
    "author_email": "jsbronder@cold-front.org",
    "download_url": "https://files.pythonhosted.org/packages/34/6b/7c3e984ef144c2a034bd7c881f2ae0516df8e8f845909f757a3ae04e5532/asyncio-dgram-2.2.0.tar.gz",
    "platform": null,
    "description": "[![Build Status](https://github.com/jsbronder/asyncio-dgram/workflows/ci/badge.svg)](https://github.com/jsbronder/asyncio-dgram/actions)\n\n# Higher level Datagram support for Asyncio\nSimple wrappers that allow you to `await read()` from datagrams as suggested\nby Guido van Rossum\n[here](https://github.com/python/asyncio/pull/321#issuecomment-187022351).  I\nfrequently found myself having to inherit from `asyncio.DatagramProtocol` and\nimplement this over and over.\n\n# Design\nThe goal of this package is to make implementing common patterns that use datagrams\nsimple and straight-forward while still supporting more esoteric options.  This is done\nby taking an opinionated stance on the API that differs from parts of asyncio.  For instance,\nrather than exposing a function like\n[create\\_datagram\\_endpoint](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint)\nwhich supports many use-cases and has conflicting parameters, `asyncio_dgram`\nonly provides three functions for creating a stream:\n\n- `connect((host, port))`: Creates a datagram endpoint which can only\n  communicate with the endpoint it connected to.\n- `bind((host, port))`: Creates a datagram endpoint that can communicate\n  with anyone, but must specified the destination address every time it\n  sends.\n- `from_socket(sock)`: If the above two functions are not sufficient, then\n  `asyncio_dgram` simply lets the caller setup the socket as they see fit.\n\n\n# Example UDP echo client and server\nFollowing the example of asyncio documentation, here's what a UDP echo client\nand server would look like.\n```python\nimport asyncio\n\nimport asyncio_dgram\n\n\nasync def udp_echo_client():\n    stream = await asyncio_dgram.connect((\"127.0.0.1\", 8888))\n\n    await stream.send(b\"Hello World!\")\n    data, remote_addr = await stream.recv()\n    print(f\"Client received: {data.decode()!r}\")\n\n    stream.close()\n\n\nasync def udp_echo_server():\n    stream = await asyncio_dgram.bind((\"127.0.0.1\", 8888))\n\n    print(f\"Serving on {stream.sockname}\")\n\n    data, remote_addr = await stream.recv()\n    print(f\"Echoing {data.decode()!r}\")\n    await stream.send(data, remote_addr)\n\n    await asyncio.sleep(0.5)\n    print(f\"Shutting down server\")\n\n\ndef main():\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(asyncio.gather(udp_echo_server(), udp_echo_client()))\n\n\nif __name__ == \"__main__\":\n    main()\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Higher level Datagram support for Asyncio",
    "version": "2.2.0",
    "project_urls": {
        "Homepage": "https://github.com/jsbronder/asyncio-dgram"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6100cb33d8a9ebad87c9507262b131c92659bcf62975320b7feb9acdfb260ba0",
                "md5": "8797ebaa0a021f8e805b09d0064ee7db",
                "sha256": "7afe5a587d1d57908c7a02fe84c785f075d3fb59b555039a6ff8aead28622743"
            },
            "downloads": -1,
            "filename": "asyncio_dgram-2.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8797ebaa0a021f8e805b09d0064ee7db",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 7403,
            "upload_time": "2024-05-08T19:21:48",
            "upload_time_iso_8601": "2024-05-08T19:21:48.138270Z",
            "url": "https://files.pythonhosted.org/packages/61/00/cb33d8a9ebad87c9507262b131c92659bcf62975320b7feb9acdfb260ba0/asyncio_dgram-2.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "346b7c3e984ef144c2a034bd7c881f2ae0516df8e8f845909f757a3ae04e5532",
                "md5": "c185d2acd4a9b787fc5b0a32b489b2e1",
                "sha256": "73362b491786153d8b888936c5780548b40b4e6f5e0d62bfef956cb7b6ed9684"
            },
            "downloads": -1,
            "filename": "asyncio-dgram-2.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "c185d2acd4a9b787fc5b0a32b489b2e1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 11944,
            "upload_time": "2024-05-08T19:21:49",
            "upload_time_iso_8601": "2024-05-08T19:21:49.269870Z",
            "url": "https://files.pythonhosted.org/packages/34/6b/7c3e984ef144c2a034bd7c881f2ae0516df8e8f845909f757a3ae04e5532/asyncio-dgram-2.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-08 19:21:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jsbronder",
    "github_project": "asyncio-dgram",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "asyncio-dgram"
}
        
Elapsed time: 0.62858s