1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
|
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Train implements Runnable {
/* Identifiant du train */
private String id;
/* Nom du train */
private String nom;
private Gare destination;
private Long sleepTime=10000L;
/**
* Position actuelle
*/
private int position;
/**
* Vitesse du train (Distance parcourue par le train chaque itération)
*/
private int vitesse;
/* Object Socket pour les connexions TCP */
Socket socket=null;
/* Adresse du serveur distant ip ou hostname */
private String serverHost;
/* Port d'écoute du serveur */
private int serverPort;
Thread t;
/**
* Nombre max d'erreurs de connexions.
* Si ce nombre est atteint. Le programme train s'arrête.
*/
private static int NB_MAX_ERROR=3;
/**
* Nombre actuel d'erreur
*/
private int currentNumberOfErrors;
/**
* Constructeur de la class Train
* @param id
* @param name
* @param destination
*/
public Train(String id, String nom, Gare destination) {
this.id = id;
this.nom = nom;
this.destination=destination;
/* Position de départ */
this.position=0;
}
public int getVitesse() {
return vitesse;
}
public void setVitesse(int vitesse) {
this.vitesse = vitesse;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@Override
public void run() {
while(!arret()){
try{
/* Connexion au server */
socket = new Socket(serverHost,serverPort);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(socket.getOutputStream());
/* Envoyer les informations au serveur */
objectOutputStream.writeObject(getMessage());
/* Récupérer les informations du serveur */
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
String retourServeur = (String) objectInputStream.readObject();
traitRetour(retourServeur);
/* Fermer les connexions */
objectInputStream.close();
objectOutputStream.close();
socket.close();
Thread.sleep(sleepTime);
}catch(UnknownHostException exp){
currentNumberOfErrors=currentNumberOfErrors+1;
exp.printStackTrace();
}catch(IOException exp){
currentNumberOfErrors=currentNumberOfErrors+1;
exp.printStackTrace();
} catch(InterruptedException exp){
currentNumberOfErrors=currentNumberOfErrors+1;
exp.printStackTrace();
} catch(ClassNotFoundException exp){
currentNumberOfErrors=currentNumberOfErrors+1;
exp.printStackTrace();
}
}
}
/**
* Traitement des retours du serveur
* le retour peut être:
* ok => le train coninue d'avancer
* stop => le train doit s'arrêre
* @param retourServeur
*/
private void traitRetour(String retourServeur) {
System.out.println("Retour du serveur:"+retourServeur);
if(retourServeur.startsWith("stop")){
System.out.println("Ordre d'arrêt. Postion de train non changée");
}else if(retourServeur.startsWith("ok")){
avanceTrain();
}
}
public void avanceTrain(){
position=position+vitesse;
}
/**
* Démarre le train.
*
* @param server adresse du serveur (qui s'occupe de la gestion des trains)
* @param port port d'écoute du serveur
*/
public void demarre(String server,int port){
serverHost=server;
serverPort=port;
t=new Thread(this);
t.start();
}
private String getMessage(){
return id+","+nom+","+destination.getNom()+","+position+","+vitesse;
}
/**
* Permet de retourner si le train est toujours en marche
* @return True si le train est en arrêt.
*/
public boolean arret(){
if(currentNumberOfErrors>NB_MAX_ERROR){
return true;
}else{
/*
Le train s'arrête quand il arrive Ã* la gare d'arrivée =>
position du train = position de la gare
*/
if(position<=destination.getPosition()){
return false;
}else{
return true;
}
}
}
public static void main(String[] args) throws InterruptedException{
/* Gare d'arrivée*/
Gare gareC=new Gare("Gare C",300);
/* Configuration du premier Train */
Train train1=new Train("T1","Train A",gareC);
train1.setVitesse(10);
train1.demarre("127.0.0.1",9001);
/*Une petite pause avant de lancer le deuxième train */
Thread.sleep(5000L);
/* Configuration du premier Train */
Train train2=new Train("T2","Train B",gareC);
train2.setVitesse(7);
/* Position du départ du train du B qui correspond Ã* la Garre B */
train2.setPosition(80);
train2.demarre("127.0.0.1",9001);
/*Une petite pause avant de lancer le deuxième train */
Thread.sleep(5000L);
/* Configuration du premier Train */
Train train3=new Train("T3","Train C",gareC);
train3.setVitesse(5);
/* Position du départ du train du B qui correspond Ã* la Garre B */
train3.setPosition(60);
train3.demarre("127.0.0.1",9001);
}
} |
Partager