Advertisement
Guest User

RUST - CHATROOM

a guest
Mar 3rd, 2016
1,620
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.00 KB | None | 0 0
  1. extern crate websocket;
  2.  
  3. use std::str;
  4. use std::sync::{Arc, Mutex};
  5. use std::sync::mpsc;
  6. use std::thread;
  7.  
  8. use websocket::{Server, Message, Sender, Receiver};
  9. use websocket::header::WebSocketProtocol;
  10. use websocket::message::Type;
  11.  
  12.  
  13. fn main() {
  14.     let server = Server::bind("0.0.0.0:2794").unwrap();
  15.  
  16.     let (dispatcher_tx, dispatcher_rx) = mpsc::channel::<String>();
  17.     let client_senders: Arc<Mutex<Vec<mpsc::Sender<String>>>> = Arc::new(Mutex::new(vec![]));
  18.  
  19.     // dispatcher thread
  20.     {
  21.         let client_senders = client_senders.clone();
  22.         thread::spawn(move || {
  23.             while let Ok(msg) = dispatcher_rx.recv() {
  24.                 for sender in client_senders.lock().unwrap().iter() {
  25.                     sender.send(msg.clone()).unwrap();
  26.                 }
  27.             }
  28.         });
  29.     }
  30.  
  31.     // client threads
  32.     for connection in server {
  33.         let dispatcher = dispatcher_tx.clone();
  34.         let (client_tx, client_rx) = mpsc::channel();
  35.         client_senders.lock().unwrap().push(client_tx);
  36.  
  37.         // Spawn a new thread for each connection.
  38.         thread::spawn(move || {
  39.             let request = connection.unwrap().read_request().unwrap(); // Get the request
  40.             let headers = request.headers.clone(); // Keep the headers so we can check them
  41.  
  42.             request.validate().unwrap(); // Validate the request
  43.  
  44.             let mut response = request.accept(); // Form a response
  45.  
  46.             if let Some(&WebSocketProtocol(ref protocols)) = headers.get() {
  47.                 if protocols.contains(&("rust-websocket".to_string())) {
  48.                     // We have a protocol we want to use
  49.                     response.headers.set(WebSocketProtocol(vec!["rust-websocket".to_string()]));
  50.                 }
  51.             }
  52.  
  53.             let mut client = response.send().unwrap(); // Send the response
  54.  
  55.             let ip = client.get_mut_sender()
  56.                 .get_mut()
  57.                 .peer_addr()
  58.                 .unwrap();
  59.  
  60.             println!("Connection from {}", ip);
  61.  
  62.             let message: Message = Message::text("SERVER: Connected.".to_string());
  63.             client.send_message(&message).unwrap();
  64.  
  65.             let (mut sender, mut receiver) = client.split();
  66.  
  67.             let(tx, rx) = mpsc::channel::<Message>();
  68.             thread::spawn(move || {
  69.                 for message in receiver.incoming_messages() {
  70.                     tx.send(message.unwrap()).unwrap();
  71.                 }
  72.             });
  73.  
  74.             loop {
  75.                 if let Ok(message) = rx.try_recv() {
  76.                     match message.opcode {
  77.                         Type::Close => {
  78.                             let message = Message::close();
  79.                             sender.send_message(&message).unwrap();
  80.                             println!("Client {} disconnected", ip);
  81.                             return;
  82.                         },
  83.                         Type::Ping => {
  84.                             let message = Message::pong(message.payload);
  85.                             sender.send_message(&message).unwrap();
  86.                         },
  87.                         _ => {
  88.                             let payload_bytes = &message.payload;
  89.                             let payload_string = match str::from_utf8(payload_bytes) {
  90.                                 Ok(v) => v,
  91.                                 Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
  92.                             };
  93.                             let msg_string = format!("MESSAGE: {}: ", payload_string);
  94.                             dispatcher.send(msg_string).unwrap();
  95.                         }
  96.                     }
  97.                 }
  98.                 if let Ok(message) = client_rx.try_recv() {
  99.                     let message: Message = Message::text(message);
  100.                     sender.send_message(&message).unwrap();
  101.                 }
  102.             }
  103.         });
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement