- Types de données :
i32
,u32
,f32
,String
, etc. - Conventions : noms en
snake_case
, pas de tirets ni de chiffres au début. - Variables :
let
, typage explicite (let age: u32 = 30
) ou implicite.
-
Déclaration avec
fn
-
Paramètres typés, valeurs de retour (
-> i32
) -
Appels depuis
main()
-
Exemples :
fn addition(n1: i32, n2: i32) -> i32 { ... }
fn say_hello(nom: &str)
-
Définition de types personnalisés comme
Salarie
,Personne
,CompteBancaire
-
Implémentation de méthodes avec
impl
-
Types d’accès :
&self
→ lecture&mut self
→ modificationself
→ consommation (l’objet n’est plus utilisable ensuite)
-
Attributs :
nom
etsolde
-
Méthodes :
afficher()
deposer(montant)
retirer(montant)
fermer()
→ consomme l’objet
-
Points bonus proposés :
- Interdire dépôt négatif
- Renommer un compte (nouvelle instance)
- Gérer plusieurs comptes via
Vec<CompteBancaire>
-
if
pour tester parité, bornes, etc. -
Boucles :
for i in 1..=10
loop { ... break; }
while compteur < 5
-
Itérations avec index via
.enumerate()
-
Utilisation de
.iter()
pour itérer sans consommer les éléments
-
Tableaux statiques
[i32; 4]
-
Vecteurs dynamiques
vec![...]
-
Exemples :
for &elt in &tab
: itération sans transfert de propriété- Affichage de menus dynamiques avec
Vec
etenumerate()
- Similaire à
switch
en C/Java, mais plus puissant - Exemple :
match nombre {
1 => println!("Un"),
2 => println!("Deux"),
_ => println!("Autre")
}
Les notions suivantes ont été abordées :
Structures (struct
) : encapsulation des propriétés d’un fichier dans une structure Fichier
.
Implémentation de méthodes (impl
) : toutes les opérations (créer, lire, écrire...) sont définies dans un bloc impl
lié à la structure.
Gestion de l'ownership et du borrowing : passage de &self
dans les méthodes pour respecter le modèle d’ownership de Rust.
Utilisation de match
, loop
, while
: menu principal interactif basé sur des structures de contrôle.
Gestion des fichiers avec std::fs
et OpenOptions
.
Utilisation de la bibliothèque chrono
: ajout de la date/heure aux opérations pour le suivi.
Manipulation de chemins de fichiers : via std::path::Path
pour vérifier l'existence.
Gestion des erreurs (Result
, match
) : traitement propre des erreurs lors des lectures/écritures.
Fonctions asynchrones (async fn) et await : exécution non bloquante de tâches. Macro #[tokio::main] : transforme main() en fonction asynchrone avec le runtime Tokio. Gestion des connexions TCP : TcpListener::bind, TcpStream, accept().await. Lecture asynchrone ligne par ligne : via tokio::io::BufReader et .lines().await. Partage de ressources entre tâches : Arc pour le comptage de références partagé. Accès concurrent sécurisé : tokio::sync::Mutex pour protéger le fichier partagé. Création de tâches concurrentes : tokio::spawn(async move { ... }). Formatage d’horodatage : chrono::Utc::now().to_rfc3339().
Implémentation d'un client DNS qui envoie des requêtes pour résoudre un nom de domaine, et un serveur DNS simplifié qui répond avec une adresse IP codée en dur.
- Envoi/réception de paquets DNS via UDP avec
tokio::net::UdpSocket
- Extraction du nom de domaine à partir du buffer binaire (RFC 1035)
- Construction manuelle d'une réponse DNS binaire avec entête et réponse IP
on lance server_dns_tp7.rs
avec la commande cargo run --bin server_dns_tp7
puis client_dns_tp7.rs
avec la commande cargo run --bin client_dns_tp7
j'ai choisi de créer un protocole de messagerie au-dessus de TCP, avec un format JSON personnalisé contenant un expéditeur, un contenu et un horodatage.
- Communication via
tokio::net::TcpStream
etTcpListener
- Structure
Message
sérialisée avecserde_json
- Gestion de plusieurs clients en tâches parallèles (serveur non bloquant)
- Client interactif en ligne de commande avec pseudo
on lance server_chat_tp8.rs
avec la commande cargo run --bin server_chat_tp8
puis client_chat_tp8.rs
avec la commande cargo run --bin client_chat_tp8
Utilisation d'un serveur et d'un client WebSocket pour des communications full-duplex en temps réel, inspirées des chats modernes.
- Serveur WebSocket avec
tokio-tungstenite
- Client WebSocket qui lit les entrées utilisateur et reçoit les messages du serveur
- Splitting des flux (
read
/write
) pour paralléliser l'envoi et la réception
on lance server_ws_tp9.rs
avec la commande cargo run --bin server_ws_tp9
puis client_ws_tp9.rs
avec la commande cargo run --bin client_ws_tp9