Updated, but client still doesn't display text
This commit is contained in:
parent
4291abbdaf
commit
ce45fb60ad
@ -1,6 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "chat-reseau"
|
name = "chat-reseau"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
authors = ["Phuntsok Drak-pa <drakpa@drakpa.fr>"]
|
authors = ["Lucien Cartier-Tilet <drakpa@drakpa.fr>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bufstream = "0.1"
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
extern crate bufstream;
|
||||||
use std::net::TcpStream;
|
use std::net::TcpStream;
|
||||||
use std::io::{Read, Write};
|
use std::io::{stdin, stdout, Read, Write};
|
||||||
use std::io::{stdin, stdout};
|
// use std::sync::mpsc;
|
||||||
|
// use std::sync::mpsc::{Receiver, Sender};
|
||||||
|
use std::thread::spawn;
|
||||||
|
// use self::bufstream::BufStream;
|
||||||
|
|
||||||
fn get_entry() -> String {
|
fn get_entry() -> String {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
@ -9,12 +13,51 @@ fn get_entry() -> String {
|
|||||||
buf.replace("\n", "").replace("\r", "")
|
buf.replace("\n", "").replace("\r", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exchange_with_server(mut stream: TcpStream) {
|
fn read_from_server(
|
||||||
|
mut stream: TcpStream,
|
||||||
|
) {
|
||||||
|
let buff = &mut [0; 1024];
|
||||||
let stdout = stdout();
|
let stdout = stdout();
|
||||||
let mut io = stdout.lock();
|
let mut io = stdout.lock();
|
||||||
let buf = &mut [0; 1024];
|
loop {
|
||||||
|
match stream.read(buff) {
|
||||||
|
Ok(received) => {
|
||||||
|
if received < 1 {
|
||||||
|
// println!("Perte de connexion avec le serveur");
|
||||||
|
write!(io, "Perte de connexion avec le serveur\n").unwrap();
|
||||||
|
io.flush().unwrap();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
// println!("Perte de connexion avec le serveur");
|
||||||
|
write!(io, "Perte de connexion avec le serveur\n").unwrap();
|
||||||
|
io.flush().unwrap();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let reponse = String::from_utf8(buff.to_vec()).unwrap();
|
||||||
|
write!(io, "{}", reponse).unwrap();
|
||||||
|
io.flush().unwrap();
|
||||||
|
// println!("From server: {}", reponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn exchange_with_server(
|
||||||
|
mut stream: TcpStream
|
||||||
|
) {
|
||||||
|
let stdout = stdout();
|
||||||
|
let mut io = stdout.lock();
|
||||||
|
let _buff = &mut [0; 1024];
|
||||||
|
|
||||||
|
let stream_cpy = stream.try_clone().unwrap();
|
||||||
|
spawn(move || {
|
||||||
|
// let stream_cpy = stream.try_clone().unwrap();
|
||||||
|
read_from_server(stream_cpy);
|
||||||
|
});
|
||||||
|
|
||||||
|
println!("Enter `quit` or `exit` when you want to leave");
|
||||||
|
|
||||||
println!("Enter `quit` when you want to leave");
|
|
||||||
loop {
|
loop {
|
||||||
write!(io, "> ").unwrap();
|
write!(io, "> ").unwrap();
|
||||||
io.flush().unwrap();
|
io.flush().unwrap();
|
||||||
@ -29,26 +72,53 @@ fn exchange_with_server(mut stream: TcpStream) {
|
|||||||
}
|
}
|
||||||
line => {
|
line => {
|
||||||
write!(stream, "{}\n", line).unwrap();
|
write!(stream, "{}\n", line).unwrap();
|
||||||
match stream.read(buf) {
|
// match stream.read(buff) {
|
||||||
Ok(received) => {
|
// Ok(received) => {
|
||||||
if received < 1 {
|
// if received < 1 {
|
||||||
println!("Perte de la connexion avec le serveur");
|
// println!("Perte de la connexion avec le serveur");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
Err(_) => {
|
// Err(_) => {
|
||||||
println!("Perte de la connexion avec le serveur");
|
// println!("Perte de la connexion avec le serveur");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// println!("Réponse du serveur : {}", buf);
|
// println!("Réponse du serveur : {}", buf);
|
||||||
let reponse = String::from_utf8(buf.to_vec()).unwrap();
|
// let reponse = String::from_utf8(buf.to_vec()).unwrap();
|
||||||
println!("Réponse du serveur : {}", reponse);
|
// println!("Réponse du serveur : {}", reponse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fn exchange_with_server(stream: TcpStream) {
|
||||||
|
// let (chan, recv): (Sender<String>, Receiver<String>) = mpsc::channel();
|
||||||
|
// // let buf = &mut [0; 1024];
|
||||||
|
// spawn(move || {
|
||||||
|
// loop {
|
||||||
|
// let msg = recv.recv().unwrap();
|
||||||
|
// println!("{}", msg);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// println!("Enter `quit` or `exit` when you want to leave");
|
||||||
|
// loop {
|
||||||
|
// match &*get_entry() {
|
||||||
|
// "quit" => {
|
||||||
|
// println!("bye!");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// "exit" => {
|
||||||
|
// println!("bye!");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// line => {
|
||||||
|
// chan.send(format!("{}", line)).unwrap();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
pub fn client(server_address: String) {
|
pub fn client(server_address: String) {
|
||||||
println!("Tentative de connexion a serveur...");
|
println!("Tentative de connexion a serveur...");
|
||||||
match TcpStream::connect(server_address) {
|
match TcpStream::connect(server_address) {
|
||||||
@ -58,6 +128,7 @@ pub fn client(server_address: String) {
|
|||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("La connection au serveur a échoué : {}", e);
|
println!("La connection au serveur a échoué : {}", e);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@ fn main() {
|
|||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
println!("Opening server on port {}", args[1]);
|
println!("Opening server on port {}", args[1]);
|
||||||
// serveur(args[1].clone());
|
// serveur(args[1].clone());
|
||||||
server::serveur(args[1].clone());
|
let mut serv = String::from("127.0.0.1:");
|
||||||
|
serv.push_str(&args[1]);
|
||||||
|
server::serveur(serv);
|
||||||
} else if args.len() == 3 {
|
} else if args.len() == 3 {
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
// Client opened //
|
// Client opened //
|
||||||
|
@ -1,78 +1,92 @@
|
|||||||
use std::net::{TcpListener, TcpStream};
|
extern crate bufstream;
|
||||||
use std::io::{Read, Write};
|
use std::io::{BufRead, Write};
|
||||||
use std::thread;
|
use std::net::{SocketAddr, TcpListener, TcpStream};
|
||||||
|
use std::str::FromStr;
|
||||||
|
use std::sync::{mpsc, Arc, RwLock};
|
||||||
|
use std::sync::mpsc::{Receiver, Sender};
|
||||||
|
use std::thread::spawn;
|
||||||
|
use self::bufstream::BufStream;
|
||||||
|
|
||||||
fn handle_client(mut stream: &TcpStream, adresse: &str, name: String) {
|
fn handle_connection(
|
||||||
let mut msg: Vec<u8> = Vec::new();
|
stream: &mut BufStream<TcpStream>,
|
||||||
|
chan: Sender<String>,
|
||||||
|
arc: Arc<RwLock<Vec<String>>>,
|
||||||
|
) {
|
||||||
|
stream.write(b"Welcome this server!\n").unwrap();
|
||||||
|
stream
|
||||||
|
.write(b"Please input your username (max. 20chars): ")
|
||||||
|
.unwrap();
|
||||||
|
stream.flush().unwrap();
|
||||||
|
|
||||||
|
let mut name = String::new();
|
||||||
|
stream.read_line(&mut name).unwrap();
|
||||||
|
let name = name.trim_right();
|
||||||
|
stream
|
||||||
|
.write_fmt(format_args!("Hello, {}!\n", name))
|
||||||
|
.unwrap();
|
||||||
|
stream.flush().unwrap();
|
||||||
|
|
||||||
|
let mut pos = 0;
|
||||||
loop {
|
loop {
|
||||||
let buf = &mut [0; 10];
|
{
|
||||||
|
let lines = arc.read().unwrap();
|
||||||
match stream.read(buf) {
|
for i in pos..lines.len() {
|
||||||
Ok(received) => {
|
stream.write_fmt(format_args!("{}", lines[i])).unwrap();
|
||||||
// si on a reçu 0 octet, ça veut dire que le client s'est déconnecté
|
pos = lines.len();
|
||||||
if received < 1 {
|
|
||||||
println!("Client disconnected {}", adresse);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let mut x = 0;
|
|
||||||
|
|
||||||
for c in buf {
|
|
||||||
// si on a dépassé le nombre d'octets reçus, inutile de continuer
|
|
||||||
if x >= received {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
x += 1;
|
|
||||||
if *c == '\n' as u8 {
|
|
||||||
println!(
|
|
||||||
"message reçu {}({}) : {}",
|
|
||||||
name,
|
|
||||||
adresse,
|
|
||||||
// on convertit maintenant notre buffer en String
|
|
||||||
String::from_utf8(msg).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
stream.write(b"ok\n").unwrap();
|
|
||||||
|
|
||||||
msg = Vec::new();
|
|
||||||
} else {
|
|
||||||
msg.push(*c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(_) => {
|
|
||||||
println!("Client disconnected {}", adresse);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stream.write(b" > ").unwrap();
|
||||||
|
stream.flush().unwrap();
|
||||||
|
|
||||||
|
let mut reads = String::new();
|
||||||
|
stream.read_line(&mut reads).unwrap();
|
||||||
|
if reads.trim().len() != 0 {
|
||||||
|
chan.send(format!("[{}] said: {}", name, reads)).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn serveur(port: String) {
|
pub fn serveur(addr: String) {
|
||||||
println!("Port: {}", port);
|
// Ouverture de la connexion sur socket
|
||||||
let mut serv = String::from("127.0.0.1:");
|
let addr = SocketAddr::from_str(&addr).unwrap();
|
||||||
serv.push_str(&port);
|
// Ajout d’un listener Tcp sur le socket
|
||||||
let listener = TcpListener::bind(serv.to_string()).unwrap();
|
let listener = TcpListener::bind(addr).unwrap();
|
||||||
|
|
||||||
println!("En attente d’un client...");
|
// création des receveurs et envoyeurs de strings asynchrones
|
||||||
|
let (sender, receiver): (Sender<String>, Receiver<String>) = mpsc::channel();
|
||||||
|
let arc: Arc<RwLock<Vec<String>>> = Arc::new(RwLock::new(Vec::new()));
|
||||||
|
let arc_w = arc.clone();
|
||||||
|
|
||||||
// Multi-client ///////////////////////////////////////////////////////////
|
// boucle infinie en parallèle pour recevoir des messages
|
||||||
|
spawn(move || {
|
||||||
|
loop {
|
||||||
|
// lit le message depuis le receveur
|
||||||
|
let msg = receiver.recv().unwrap();
|
||||||
|
print!("DEBUG: message {}", msg);
|
||||||
|
{
|
||||||
|
let mut arc_w = arc_w.write().unwrap();
|
||||||
|
arc_w.push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Réception des clients
|
||||||
for stream in listener.incoming() {
|
for stream in listener.incoming() {
|
||||||
match stream {
|
match stream {
|
||||||
Ok(stream) => {
|
Err(e) => println!("Erreur écoute : {}", e),
|
||||||
let adresse = match stream.peer_addr() {
|
Ok(mut stream) => {
|
||||||
Ok(addr) => format!("[adresse : {}]", addr),
|
println!(
|
||||||
Err(_) => "inconnue".to_owned(),
|
"Nouvelle connexion de {} vers {}",
|
||||||
};
|
stream.peer_addr().unwrap(),
|
||||||
|
stream.local_addr().unwrap()
|
||||||
let name = String::from("Toto");
|
);
|
||||||
|
let sender = sender.clone();
|
||||||
println!("Nouveau client {}", adresse);
|
let arc = arc.clone();
|
||||||
thread::spawn(move || handle_client(&stream, &*adresse, name));
|
spawn(move || {
|
||||||
}
|
let mut stream = BufStream::new(stream);
|
||||||
Err(e) => {
|
handle_connection(&mut stream, sender, arc);
|
||||||
println!("La connexion du client a échoué : {}", e);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
println!("En attente d’un autre client...");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user