title: Transport
An Ockam Transport is a plugin for Ockam Routing. It moves Ockam Routing messages using a specific transport protocol like TCP, UDP, WebSockets, Bluetooth etc.
In previous examples, we routed messages locally within one node. Routing messages over transport layer connections looks very similar.
Let's try the TcpTransport, we'll need to create two nodes: a responder and an initiator.
Create a new file at:
touch examples/04-routing-over-transport-responder.rs
Add the following code to this file:
// examples/04-routing-over-transport-responder.rs
// This node starts a tcp listener and an echoer worker.
// It then runs forever waiting for messages.
use hello_ockam::Echoer;
use ockam::{Context, Result, TcpTransport};
#[ockam::node]
async fn main(ctx: Context) -> Result<()> {
// Initialize the TCP Transport.
let tcp = TcpTransport::create(&ctx).await?;
// Create a TCP listener and wait for incoming connections.
tcp.listen("127.0.0.1:4000").await?;
// Create an echoer worker
ctx.start_worker("echoer", Echoer).await?;
// Don't call ctx.stop() here so this node runs forever.
Ok(())
}
Create a new file at:
touch examples/04-routing-over-transport-initiator.rs
Add the following code to this file:
// examples/04-routing-over-transport-initiator.rs
// This node routes a message, to a worker on a different node, over the tcp transport.
use ockam::{route, Context, Result, TcpTransport, TCP};
#[ockam::node]
async fn main(mut ctx: Context) -> Result<()> {
// Initialize the TCP Transport.
let _tcp = TcpTransport::create(&ctx).await?;
// Send a message to the "echoer" worker, on a different node, over a tcp transport.
let r = route![(TCP, "localhost:4000"), "echoer"];
ctx.send(r, "Hello Ockam!".to_string()).await?;
// Wait to receive a reply and print it.
let reply = ctx.receive::<String>().await?;
println!("App Received: {}", reply); // should print "Hello Ockam!"
// Stop all workers, stop the node, cleanup and return.
ctx.stop().await
}
Run the responder:
cargo run --example 04-routing-over-transport-responder
Run the initiator:
cargo run --example 04-routing-over-transport-initiator
Note the message flow.
Create a new file at:
touch examples/04-routing-over-transport-two-hops-responder.rs
Add the following code to this file:
// examples/04-routing-over-transport-two-hops-responder.rs
// This node starts a tcp listener and an echoer worker.
// It then runs forever waiting for messages.
use hello_ockam::Echoer;
use ockam::{Context, Result, TcpTransport};
#[ockam::node]
async fn main(ctx: Context) -> Result<()> {
// Initialize the TCP Transport.
let tcp = TcpTransport::create(&ctx).await?;
// Create a TCP listener and wait for incoming connections.
tcp.listen("127.0.0.1:4000").await?;
// Create an echoer worker
ctx.start_worker("echoer", Echoer).await?;
// Don't call ctx.stop() here so this node runs forever.
Ok(())
}
Create a new file at:
touch examples/04-routing-over-transport-two-hops-middle.rs
Add the following code to this file:
// examples/04-routing-over-transport-two-hops-middle.rs
// This node creates a tcp connection to a node at 127.0.0.1:4000
// Starts a tcp listener at 127.0.0.1:3000
// It then runs forever waiting to route messages.
use ockam::{Context, Result, TcpTransport};
#[ockam::node]
async fn main(ctx: Context) -> Result<()> {
// Initialize the TCP Transport.
let tcp = TcpTransport::create(&ctx).await?;
// Create a TCP listener and wait for incoming connections.
tcp.listen("127.0.0.1:3000").await?;
// Don't call ctx.stop() here so this node runs forever.
Ok(())
}
Create a new file at:
touch examples/04-routing-over-transport-two-hops-initiator.rs
Add the following code to this file:
// examples/04-routing-over-transport-two-hops-initiator.rs
// This node routes a message, to a worker on a different node, over two tcp transport hops.
use ockam::{route, Context, Result, TcpTransport, TCP};
#[ockam::node]
async fn main(mut ctx: Context) -> Result<()> {
// Initialize the TCP Transport.
let _tcp = TcpTransport::create(&ctx).await?;
// Send a message to the "echoer" worker, on a different node, over two tcp hops.
let r = route![(TCP, "localhost:3000"), (TCP, "localhost:4000"), "echoer"];
ctx.send(r, "Hello Ockam!".to_string()).await?;
// Wait to receive a reply and print it.
let reply = ctx.receive::<String>().await?;
println!("App Received: {}", reply); // should print "Hello Ockam!"
// Stop all workers, stop the node, cleanup and return.
ctx.stop().await
}
Run the responder:
cargo run --example 04-routing-over-transport-two-hops-responder
Run middle:
cargo run --example 04-routing-over-transport-two-hops-middle
Run the initiator:
cargo run --example 04-routing-over-transport-two-hops-initiator
Note how the message is routed.
Next: 05. Secure Channel