Advertisement
Guest User

Untitled

a guest
Jul 10th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.83 KB | None | 0 0
  1. use std::sync::mpsc::SyncSender;
  2. use std::sync::mpsc::Receiver;
  3. use std::sync::mpsc::sync_channel;
  4. use std::thread;
  5. use std::io::{Read, Write};
  6. use std::sync::{Arc, Mutex};
  7. #[macro_use]
  8. extern crate lazy_static;
  9.  
  10. use std::net::{TcpListener, TcpStream, Shutdown};
  11. use std::collections::HashMap;
  12.  
  13. lazy_static! {
  14.     static ref C_Senders: Mutex<HashMap<u32, SyncSender<String>>> = Mutex::new(HashMap::new());
  15. }
  16.  
  17. fn main() {
  18.     let listener = TcpListener::bind("0.0.0.0:3333").unwrap();
  19.     let mut client_id = 0;
  20.  
  21.     for stream in listener.incoming() {
  22.         match stream {
  23.             Ok(mut stream) => {
  24.                 thread::spawn(move || {
  25.                     // notify server about new connection
  26.                     println!("New connection: {}", stream.peer_addr().unwrap());
  27.    
  28.                     // create channel
  29.                     let (sender, receiver) = sync_channel(1024);
  30.  
  31.                     // take ownership of hashmap
  32.                     let mut senders = C_Senders.lock().unwrap();
  33.                    
  34.                     // insert new client to hashmap
  35.                     senders.insert(client_id, sender);
  36.  
  37.                     // delete ownership of hashmap above
  38.                     drop(senders);
  39.  
  40.                     // create clone of stream
  41.                     let mut read_stream = stream.try_clone().unwrap();
  42.  
  43.                     // and move it to new thread
  44.                     spawn_reading_thread(client_id, read_stream);
  45.                
  46.                     // receiving
  47.                     loop {
  48.                         // getting message from receiver
  49.                         let msg = receiver.recv().unwrap();
  50.  
  51.                         // writing if msg found
  52.                         stream.write(msg.as_bytes());  
  53.                     }
  54.                 });
  55.  
  56.                 client_id = client_id + 1;
  57.             },
  58.             Err(_) => {
  59.                 println!("Close");
  60.             },
  61.         }
  62.     }
  63. }
  64.  
  65. fn spawn_reading_thread(client_id: u32, mut stream: TcpStream) {
  66.     thread::spawn(move || {
  67.         // get ownership of hashmap
  68.         let mut senders    = C_Senders.lock().unwrap();
  69.        
  70.         // get ownership of client entry
  71.         let mut sender_old = senders.get_mut(&client_id).unwrap();
  72.        
  73.         // get copy of sender
  74.         let mut sender     = sender_old.clone();
  75.  
  76.         // delete ownership of hashmap and sender_old (will be autodroped cuz ts mut reference)
  77.         drop(senders);
  78.  
  79.         // we have only sender, stream and client_id available
  80.        
  81.         // create buffer [u8]
  82.         let mut buffer = [0 as u8; 1024];
  83.  
  84.         while match stream.read(&mut buffer) {
  85.             Ok(size) => {
  86.                 // if empty
  87.                 if size == 0 {return};
  88.                 if buffer[size-1] == b'\n' {
  89.                     buffer[size-1] = b'\0';
  90.                 }
  91.  
  92.                 // [u8] -> String
  93.                 let message = String::from_utf8_lossy(&buffer).to_string();
  94.  
  95.                 // send
  96.                 // get ownership of Senders HashMap
  97.                 let senders = C_Senders.lock().unwrap();
  98.  
  99.                 // notify client, who wrote about his message
  100.                 sender.send(format!("You wrote: '{}'\n", message));
  101.  
  102.                 // message for future sending
  103.                 let msg = format!("Client {} wrote: '{}'\n", client_id, message);
  104.  
  105.                 // send to everybody
  106.                 for (k, sender) in senders.iter() {
  107.                     sender.send(msg.clone());
  108.                 }
  109.  
  110.                 true
  111.             },
  112.             Err(_) => {
  113.  
  114.                 false
  115.             }
  116.         } {};
  117.     });
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement