Allow reading and writing messages from sockets in async mode

This commit is contained in:
Lasse Blaauwbroek
2023-04-20 23:58:53 +02:00
committed by Jacob Alexander
parent d53aa24733
commit 8feb377217
7 changed files with 201 additions and 1 deletions

View File

@@ -0,0 +1,54 @@
#!/usr/bin/env python3
import asyncio
import argparse
import capnp
import addressbook_capnp
def parse_args():
parser = argparse.ArgumentParser(
usage="Connects to the Example thread server \
at the given address and does some RPCs"
)
parser.add_argument("host", help="HOST:PORT")
return parser.parse_args()
async def writeAddressBook(stream, bob_id):
addresses = addressbook_capnp.AddressBook.new_message()
people = addresses.init("people", 1)
bob = people[0]
bob.id = bob_id
bob.name = "Bob"
bob.email = "bob@example.com"
bobPhones = bob.init("phones", 2)
bobPhones[0].number = "555-4567"
bobPhones[0].type = "home"
bobPhones[1].number = "555-7654"
bobPhones[1].type = "work"
bob.employment.unemployed = None
await addresses.write_async(stream)
async def main(host):
host, port = host.split(":")
stream = await capnp.AsyncIoStream.create_connection(host=host, port=port)
await writeAddressBook(stream, 0)
message = await addressbook_capnp.AddressBook.read_async(stream)
print(message)
assert message.people[0].name == "Alice"
assert message.people[0].id == 0
await writeAddressBook(stream, 1)
if __name__ == "__main__":
args = parse_args()
asyncio.run(main(args.host))

View File

@@ -0,0 +1,63 @@
#!/usr/bin/env python3
import argparse
import asyncio
import capnp
import addressbook_capnp
async def writeAddressBook(stream, alice_id):
addresses = addressbook_capnp.AddressBook.new_message()
people = addresses.init("people", 1)
alice = people[0]
alice.id = alice_id
alice.name = "Alice"
alice.email = "alice@example.com"
alicePhones = alice.init("phones", 1)
alicePhones[0].number = "555-1212"
alicePhones[0].type = "mobile"
alice.employment.school = "MIT"
await addresses.write_async(stream)
async def new_connection(stream):
message = await addressbook_capnp.AddressBook.read_async(stream)
print(message)
assert message.people[0].name == "Bob"
assert message.people[0].id == 0
await writeAddressBook(stream, 0)
message = await addressbook_capnp.AddressBook.read_async(stream)
print(message)
assert message.people[0].name == "Bob"
assert message.people[0].id == 1
message = await addressbook_capnp.AddressBook.read_async(stream)
print(message)
assert message is None
def parse_args():
parser = argparse.ArgumentParser(
usage="""Runs the server bound to the\
given address/port ADDRESS. """
)
parser.add_argument("address", help="ADDRESS:PORT")
return parser.parse_args()
async def main():
host, port = parse_args().address.split(":")
server = await capnp.AsyncIoStream.create_server(new_connection, host, port)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())