asyncio-datagram


Nameasyncio-datagram JSON
Version 1.4.0 PyPI version JSON
download
home_pagehttps://github.com/mishamyrt/asyncio-datagram
SummaryHigher level Datagram support for Asyncio
upload_time2023-12-10 22:10:27
maintainer
docs_urlNone
authorMikhael Khrustik
requires_python>=3.6
licenseMIT
keywords
VCS
bugtrack_url
requirements setuptools
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/mishamyrt/asyncio-datagram",
    "name": "asyncio-datagram",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "",
    "keywords": "",
    "author": "Mikhael Khrustik",
    "author_email": "misha@myrt.co",
    "download_url": "https://files.pythonhosted.org/packages/07/fe/04d52c81d4245535d6974992cda8f470f6ed3f74f0d11bb51b90af7eefcf/asyncio-datagram-1.4.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\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Higher level Datagram support for Asyncio",
    "version": "1.4.0",
    "project_urls": {
        "Homepage": "https://github.com/mishamyrt/asyncio-datagram"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "add8a193576311e9598582426589da9478ce489cd7b7c1f288315dd42088f012",
                "md5": "058e21d09263aae7035e788d122c5f1f",
                "sha256": "bfd40ca3e4044e8795d1fc163906e4321bb2ec54518522ed7b9097274a90c6cb"
            },
            "downloads": -1,
            "filename": "asyncio_datagram-1.4.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "058e21d09263aae7035e788d122c5f1f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 7636,
            "upload_time": "2023-12-10T22:10:25",
            "upload_time_iso_8601": "2023-12-10T22:10:25.511347Z",
            "url": "https://files.pythonhosted.org/packages/ad/d8/a193576311e9598582426589da9478ce489cd7b7c1f288315dd42088f012/asyncio_datagram-1.4.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "07fe04d52c81d4245535d6974992cda8f470f6ed3f74f0d11bb51b90af7eefcf",
                "md5": "1e8de8eb1d2338220b2144bab619cd7e",
                "sha256": "9333ce8aa60837c6a47d6e9d0d5850b5594da007f3b27371af20d4288808d3aa"
            },
            "downloads": -1,
            "filename": "asyncio-datagram-1.4.0.tar.gz",
            "has_sig": false,
            "md5_digest": "1e8de8eb1d2338220b2144bab619cd7e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 11044,
            "upload_time": "2023-12-10T22:10:27",
            "upload_time_iso_8601": "2023-12-10T22:10:27.480669Z",
            "url": "https://files.pythonhosted.org/packages/07/fe/04d52c81d4245535d6974992cda8f470f6ed3f74f0d11bb51b90af7eefcf/asyncio-datagram-1.4.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-10 22:10:27",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mishamyrt",
    "github_project": "asyncio-datagram",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "setuptools",
            "specs": []
        }
    ],
    "lcname": "asyncio-datagram"
}
        
Elapsed time: 0.17555s