The async mailbox
In this exercise, you will learn how to turn a small server implemented using threads into an asynchronous server.
Copy /solutions/threaded-mailbox
to your work directory.
1. Add async-std or tokio as a dependency
Open Cargo.toml
in your server and add:
[dependencies] #... async-std = "1.6"
or
[dependencies] # ... tokio = { version = "1", features = ["full"] }
2. Replace sync types by async types
Replace all synchronous/blocking types (mostly Thread
→ Task
, Mutex
, TcpListener
) by async types.
Turn functions into async functions if necessary.
For async-std
, the most relevant examples are:
-
TcpListener: https://docs.rs/async-std/1.9.0/async_std/net/struct.TcpListener.html#examples
-
Task: https://docs.rs/async-std/1.9.0/async_std/task/index.html
-
Mutex: https://docs.rs/async-std/1.9.0/async_std/sync/struct.Mutex.html
-
io: https://docs.rs/async-std/1.9.0/async_std/io/index.html#bufreader-and-bufwriter
For tokio
, the most relevant examples are:
Use those types and modules to replace the types from stdlib.
3. Observe the result
What changed? What stayed the same? Describe your experience.
4. Testing
You can test the server by sending:
$ echo "PUBLISH 123231213" | nc 127.0.0.1 7878 $ echo "RETRIEVE" | nc 127.0.0.1 7878
PUBLISH <message>
will insert a message into the mailbox.
RETRIEVE
will retrieve a message.
Alternatively, you can use the provided tcp-client
example:
$ cargo run -- "PUBLISH 12345" $ cargo run -- "RETRIEVE"
5. Additional Exercise
-
Make the program listen on IPV4 and IPV6.
-
Implement the program using
smol
and friends instead of the above