Skip to content

Instantly share code, notes, and snippets.

@sdogruyol
Last active August 29, 2015 14:21
Show Gist options
  • Save sdogruyol/f897eb1ca4b7cd7f4f64 to your computer and use it in GitHub Desktop.
Save sdogruyol/f897eb1ca4b7cd7f4f64 to your computer and use it in GitHub Desktop.
Chat Server
extern crate websocket;
use std::thread;
use std::sync::{Arc, Mutex};
use websocket::{Server, Message, Sender, Receiver};
fn main() {
let server = Server::bind("0.0.0.0:2794").unwrap();
let mut senders = Arc::new(Mutex::new(vec![]));
for connection in server {
// Spawn a new thread for each connection.
let mut senders = senders.clone();
thread::spawn(move || {
let request = connection.unwrap().read_request().unwrap(); // Get the request
request.validate().unwrap();
let response = request.accept(); // Form a response
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 (mut sender, mut receiver) = client.split();
{
let mut senders = senders.lock().unwrap();
senders.push(sender);
}
// println!("{}", senders.len());
for message in receiver.incoming_messages() {
let message = message.unwrap();
match message {
Message::Close(_) => {
// let message = Message::Close(None);
// sender.send_message(message).unwrap();
println!("Client {} disconnected", ip);
return;
}
Message::Ping(data) => {
// let message = Message::Pong(data);
// sender.send_message(message).unwrap();
return;
}
_ =>{
for sender in senders.lock().unwrap().iter_mut() {
let mut message = message.clone();
println!("Sending");
sender.send_message(message).unwrap();
}
},
}
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment