Tutoriel: ajouter la version client/serveur #
Regrouper les déclarations communes #
-
Dans le paquet
commun
, créer la classeDeclarations
-
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
AppPong
dans le but d’en extraire les déclarations- on va les transférer dans des méthodes statiques de
Declarations
- on va les transférer dans des méthodes statiques de
Extraire la déclaration des messages #
-
Dans
AppPong
, sélectionner l’intérieur de la méthoderegisterMessages
-
Avec Shift+Alt+M, extraire une méthode pour ce code
-
Nommer cette méthode
declarerMessages
, cocherpublic
, puis OK -
Ajuster la signature de la nouvelle méthode
declarerMessage
pour qu’elle soitpublic static
public static void declarerMessages(MessageRegistrar registrar) {
-
Placer mon curseur sur la nouvelle méthode
declarerMessage
-
Avec Shift+Alt+V, déplacer la méthode dans
Declarations
Extraire la déclaration des modèles #
-
Dans
AppPong
, sélectionner l’intérieur de la méthoderegisterModels
-
Avec Shift+Alt+M, extraire une méthode pour ce code
-
Nommer cette méthode
declarerModeles
, cocherpublic
, puis OK -
Ajuster la signature de la nouvelle méthode
declarerModeles
pour qu’elle soitpublic static
public static void declarerModeles(ModelRegistrar registrar) {
-
Placer mon curseur sur la nouvelle méthode
declarerModeles
-
Avec Shift+Alt+V, déplacer la méthode dans
Declarations
Vérifier #
-
Je devrais maintenant avoir à peu près ce code dans
AppPong
public class AppPong implements NtroAppFx { public static void main(String[] args) { NtroAppFx.launch(args); } @Override public void registerFrontend(FrontendRegistrarFx registrar) { registrar.registerFrontend(FrontalPong.class); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPong.class); } }
-
Je devrais maintenant avoir à peu près ce code dans
Declarations
public class Declarations { public static void declarerMessages(MessageRegistrar registrar) { registrar.registerMessage(MsgAjouterRendezVous.class); registrar.registerMessage(MsgRetirerRendezVous.class); registrar.registerMessage(MsgAjouterPoint.class); } public static void declarerModeles(ModelRegistrar registrar) { registrar.registerModel(ModeleFileAttente.class); registrar.registerValue(RendezVous.class); registrar.registerValue(RendezVousComplet.class); registrar.registerModel(ModelePartie.class); } }
-
Je peux encore exécuter l’application
$ sh gradlew pong
Créer la version client/serveur #
-
Dans
dorsal
, créer la classeDorsalPongDistant
-
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
DorsalPongDistant
et ajouter ce code:public class DorsalPongDistant extends RemoteBackendNtro { @Override public void registerServer(ServerRegistrar registrar) { Declarations.declarerServeur(registrar); } }
-
Avec Ctrl+.Eclipse: Ctrl+1, créer la méthode
Declarations.declarerServeur
-
Dans
Declarations
, compléter le code de cette méthodepublic class Declarations { //... public static void declarerServeur(ServerRegistrar registrar) { // ajouter registrar.registerName("localhost"); // ajouter registrar.registerPort(8002); } }
-
Dans le paquet
pong
, créer la classeClientPong
-
S’assurer d’avoir l’arborescence suivante:
-
Le code de
ClientPong
doit être comme celui deAppPong
, sauf:public class ClientPong implements NtroClientFx { public static void main(String[] args) { NtroClientFx.launch(args); } @Override public void registerFrontend(FrontendRegistrarFx registrar) { registrar.registerFrontend(FrontalPong.class); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } // XXX: utiliser un dorsal distant @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPongDistant.class); } }
-
Exécuter le client (devrais échouer sur une erreur de connexion)
$ sh gradlew pong:client # Devrait quitté sur une erreur [FATAL] failed to connect to ws://localhost:8002 [INFO] Exiting
Créer le serveur #
-
Dans
pong
, ajouter la classeServeurPong
-
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
ServeurPong
ajouter le code suivantpublic class ServeurPong implements NtroServerFx { public static void main(String[] args) { NtroServerFx.launch(args); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerServer(ServerRegistrarJdk registrar) { Declarations.declarerServeur(registrar); } @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPong.class); } }
- NOTES
- c’est maintenant le serveur qui exécute le
DorsalPong
«normal»
- c’est maintenant le serveur qui exécute le
- NOTES
Exécuter le serveur #
-
Exécuter le serveur
sh gradlew pong:serveur # devrait afficher [INFO] App running. Press Enter here to close App [INFO] Listening on ws://localhost:8002
Exécuter en mode client/serveur #
-
Avec le serveur qui roule, ouvrir un autre GitBash pour faire
$ sh gradlew pong:clientAlice # devrait maintenant afficher [INFO] connected to ws://localhost:8002
-
Avec le serveur et un premier client qui roulent, ouvrir un troisème GitBash pour faire
$ sh gradlew pong:clientBob
-
Je devrais déjà voir que
ModeleFileAttente
est synchronisé via la serveur- NOTES
- toujours utiliser plusieurs GitBash pour lancer plusieurs programmes
- attendre que le serveur soit bien lancé avant de lancer un client
- attendre qu’un soit bien lancé avant d’en lancer un autre
- NOTES
-
En cas d’erreur du type
java.net.BindException: Adresse déjà utilisée
, faire# ERREUR! java.net.BindException: Adresse déjà utilisée [FATAL] Cannot listen on ws://localhost:8002 Port already in use? # Faire $ sh gradlew --stop # Puis relancer le serveur $ sh gradlew pong:serveur
Vérifier qu’on peut toujours exécuter la version locale #
-
La version locale devrait toujours fonctionner
$ sh gradlew pong