Skip to content

Instantly share code, notes, and snippets.

@jonfk
Created September 26, 2016 04:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonfk/d8fc52080aeefd9d40850ae7dd6aa71d to your computer and use it in GitHub Desktop.
Save jonfk/d8fc52080aeefd9d40850ae7dd6aa71d to your computer and use it in GitHub Desktop.
Trying to link rust-websocket and tokio-core
extern crate websocket;
extern crate tokio_core;
extern crate futures;
use websocket::{Server, Message, Sender, Receiver};
use websocket::message::Type;
use websocket::header::WebSocketProtocol;
use futures::Future;
use futures::stream::Stream;
use tokio_core::reactor::Core;
fn main() {
let server = Server::bind("127.0.0.1:2794").unwrap();
// Create the event loop that will drive this server
let mut l = Core::new().unwrap();
let handle = l.handle();
let stream = futures::stream::iter(server);
let done = stream.for_each(|connection| {
// let request_got = connection.read_request(); // Get the request
let request_future = futures::done::<_, std::io::Error>(connection.read_request());
handle.spawn(request_future.then(|req_res| {
let request = req_res.unwrap();
let headers = request.headers.clone(); // Keep the headers so we can check them
request.validate().unwrap(); // Validate the request
let mut response = request.accept(); // Form a response
if let Some(&WebSocketProtocol(ref protocols)) = headers.get() {
if protocols.contains(&("rust-websocket".to_string())) {
// We have a protocol we want to use
response.headers.set(WebSocketProtocol(vec!["rust-websocket".to_string()]));
}
}
let mut client = response.send().unwrap(); // Send the response
let ip = client.get_mut_sender()
.get_mut()
.peer_addr()
.unwrap();
println!("Connection from {}", ip);
let message: Message = Message::text("Hello".to_string());
client.send_message(&message).unwrap();
let (mut sender, mut receiver) = client.split();
for message in receiver.incoming_messages() {
let message: Message = message.unwrap();
match message.opcode {
Type::Close => {
let message = Message::close();
sender.send_message(&message).unwrap();
println!("Client {} disconnected", ip);
}
Type::Ping => {
let message = Message::pong(message.payload);
sender.send_message(&message).unwrap();
}
_ => sender.send_message(&message).unwrap(),
};
}
Ok(())
}));
Ok(())
});
l.run(done).unwrap();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment