Allow reading and writing messages from sockets in async mode
This commit is contained in:
committed by
Jacob Alexander
parent
d53aa24733
commit
8feb377217
54
examples/async_socket_message_client.py
Normal file
54
examples/async_socket_message_client.py
Normal 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))
|
||||
63
examples/async_socket_message_server.py
Normal file
63
examples/async_socket_message_server.py
Normal 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())
|
||||
Reference in New Issue
Block a user