Server websocket et client Java, Web et Android

Cette page est au début de sa construction. Les exemples donnés sont encore bruts. Elle ne peut donc pas servir de référence, mais uniquement de point de départ.

http://fr.slideshare.net/arungupta1/websocket-10-21153123

Cette page présente au travers d’un exemple la mise en place d’un serveur websocket écrit en Java avec des clients Java, Android et Web (HTML5). L’exemple retenu est un serveur de broadcast qui reçoit des messages (Une date, une personne émettrice et un message texte) de ses clients au travers d’une websocket et qui les retransmet à tous ses clients (y compris l’émetteur). L’exemple est fait pour être facilement généralisable.

Il faut au moins un jdk 7 et maven 3.11 (pour le plugin android).

Sous fedora maven 3.1.1 est disponible. Pas encore sous ubuntu (13.10) donc à la racine de votre compte (ou ailleurs):

wget https://archive.apache.org/dist/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz
tar zxvf apache-maven-3.1.1-bin.tar.gz 
export MAVEN_HOME=~/apache-maven-3.1.1
export PATH=$MAVEN_HOME/bin:$PATH
mvn -version                                                                                                  

Dans cette application, nous avons retenu JSON comme format d’échange des messages. Il s’agit d’un format standard très utilisé, simple à manipuler et permettant une utilisation directe en HTML5.

Dans notre exemple, le serveur Java, le client Java et l’application Android manipule des instances Java mais échanges des données JSON. Il existe plusieurs possibilités pour lier une représentation JSON à des instances Java. Nous utiliserons ici la libraires Jackson (https://github.com/FasterXML/jackson).

La sérialisation Java/JSON est assez simple. Pour commencer il faut toujours avoir un constructeur sans paramètre pour les classes qui doivent être sérialisées et éviter les références circulaires ou les annoter pour éviter les cycles (cf. l’exemple ci-dessous). D’autres annotations sont possibles pour contrôler la sérialisation.

Pour faciliter l’utilisation dans notre contexte (client/server Websocket), nous allons utiliser une classe qui implante une interface qui permettra aux clients et aux servers d’encoder/decoder de façon transparente à chaque émission/réception en JSON.

Le projet suivant fournit la classe de base qu’il faudra spécialiser pour fabriquer un encodeur/décodeur JSON :

git clone https://github.com/emmanuelbruno/ws_simplejsoncoder.git
cd ws_simplejsoncodergit
git checkout 1.0.4
mvn install

La commande git checkout 1.0.4 vous permet de revenir sur une version précise (git tag pour avoir toutes les versions tagguées). Si vous voulez voir la version la plus récente : git checkout master (puis git pull). Il en sera de même pour les autres exemples. Le projet suivant donne un exemple d’utilisation de la classe précédente pour représenter/encoder/décoder des Personnes qui possèdent des Chiens :

git clone https://github.com/emmanuelbruno/ws_simplepersonne.git
cd ws_simplepersonne/
git checkout 1.0.7
mvn install

Le serveur websocket utilise la librairie Tyrus (https://tyrus.java.net/). Il s’agit d’un projet maven multi modules.

git clone https://github.com/emmanuelbruno/ws_simplewebsocket.git
cd ws_simplewebsocket/
git checkout 1.0.8
mvn install

La version 1.0.3 corrige un bug dans le client web (manque le sender) et 1.0.6 le jar avec les dépendances.

Le serveur s’exécute simplement et écoute sur toutes les adresses de la machine :

java -jar Server/target/Server-1.0-jar-with-dependencies.jar 

Des clients Java peuvent être lancés sur la même machine en laissant tourner le serveur :

java -jar JavaClient/target/JavaClient-1.0-jar-with-dependencies.jar

Pour lancer un client distant, l’adresse IP (ou le nom) voire le port (optionnel) peuvent être donnés en tant que system properties :

-Dfr.univtln.bruno.test.simple.websocket.server.ip=lsis -Dfr.univtln.bruno.test.simple.websocket.server.port=8025 

Le “client web” est en fait un serveur web Java (jetty) qui écoute sur le port 8080 et sert une page très simple, il s’exécute de la façon suivante :

cd WebClient
mvn package jetty:run-war

Il suffit ensuite d’ouvrir dans un navigateur http://localhost:8080/WebClient/ ou de remplacer localhost par le nom ou l’adresse ip du serveur. La page HTML peut être mise à jour, elle est rechargée automatiquement par le serveur.

Le client android est un projet maven construit avec l’archetype Maven pour les projets Android (http://stand.spree.de/wiki_details_maven_archetypes). Cette approche est très utile pour automatiser les tests et les déploiements. Attention, google n’a pas retenu Maven pour android mais gradle (Un possible successeur de maven). Pendant le développement, la compilation et le déploiement peuvent s’appuyer sur le pom.xml mais être plus rapide depuis un IDE (Intellij Idea et probablement eclipse).

Le SDK doit être installé avec les extras (en particulier la librairie support). Dans le SDK ces librairies sont gérées comme un entrepôt maven local. Le pom.xml de AndroidClient s’appuie sur la variable d’environnement ANDROID_SDK_HOME pour l’ajouter comme repository.

export ANDROID_SDK_HOME=/usr/local/programs/android/android-sdk-linux
export ANDROID_HOME=$ANDROID_SDK_HOME
export PATH=$ANDROID_SDK_HOME/tools:$PATH  

en cas de problème faites un lien symbolique /usr/local/programs/android-sdk-linux vers votre installation du sdk.

Le projet android est le suivant :

git clone https://bruno@lsis.univ-tln.fr/redmine/bruno/samples/simplewebsocket/simplewebsocketandroidgit.git
cd simplewebsocketandroidgit
mvn install

mvn install construit l’apk dans le target de AndroidClient, puis l’installes dans tous les devices Android listés par adb et finalement exécute (sur les devices) les tests d’intégration (avec la syntaxe des tests unitaires junit) définis dans le second module AndroidClient-it.

Le projet android utilise les concepts suivants :

  • Une activité principale basée sur les fragments
  • La barre de menu android
  • Un viewpager
  • L’activité permet de démarrer et de stopper un service. Il peuvent s’envoyer des messages avec un handler.
  • Le service créer une thread indépendante (le client) dans laquelle s’exécute la connexion au serveur websocket. La communication entre cette thread et le client se fait aussi via deux handler.

—- dataentry page —- type : Quickstart enseignement_tags : D14, D35 technologie_tags : Java, Websocket, Json theme_tags : POO, Web


~~DISCUSSION~~