[](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": "[](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"
}