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