summaryrefslogtreecommitdiffstats
path: root/examples/echo.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2016-09-01 09:18:03 -0700
committerAlex Crichton <alex@alexcrichton.com>2016-09-01 09:18:03 -0700
commit02538d035f8dc65609e75c60188fa31d4c7d23f5 (patch)
tree023df077d7664e8437eac625a924d76872580a17 /examples/echo.rs
parent6c6fb917eee295f779bb3afb050f1217f7172ee2 (diff)
Move binaries to examples
Diffstat (limited to 'examples/echo.rs')
-rw-r--r--examples/echo.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/examples/echo.rs b/examples/echo.rs
new file mode 100644
index 00000000..1116d683
--- /dev/null
+++ b/examples/echo.rs
@@ -0,0 +1,55 @@
+//! An echo server that just writes back everything that's written to it.
+
+extern crate env_logger;
+extern crate futures;
+extern crate tokio_core;
+
+use std::env;
+use std::net::SocketAddr;
+
+use futures::Future;
+use futures::stream::Stream;
+use tokio_core::Loop;
+use tokio_core::io::{copy, TaskIo};
+
+fn main() {
+ env_logger::init().unwrap();
+ let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string());
+ let addr = addr.parse::<SocketAddr>().unwrap();
+
+ // Create the event loop that will drive this server
+ let mut l = Loop::new().unwrap();
+ let pin = l.pin();
+
+ // Create a TCP listener which will listen for incoming connections
+ let server = l.handle().tcp_listen(&addr);
+
+ let done = server.and_then(move |socket| {
+ // Once we've got the TCP listener, inform that we have it
+ println!("Listening on: {}", addr);
+
+ // Pull out the stream of incoming connections and then for each new
+ // one spin up a new task copying data.
+ //
+ // We use the `io::copy` future to copy all data from the
+ // reading half onto the writing half.
+ socket.incoming().for_each(move |(socket, addr)| {
+ let socket = futures::lazy(|| futures::finished(TaskIo::new(socket)));
+ let pair = socket.map(|s| s.split());
+ let amt = pair.and_then(|(reader, writer)| copy(reader, writer));
+
+ // Once all that is done we print out how much we wrote, and then
+ // critically we *spawn* this future which allows it to run
+ // concurrently with other connections.
+ let msg = amt.map(move |amt| {
+ println!("wrote {} bytes to {}", amt, addr)
+ }).map_err(|e| {
+ panic!("error: {}", e);
+ });
+ pin.spawn(msg);
+
+ Ok(())
+ })
+ });
+ l.run(done).unwrap();
+}