Client Android connexion au serveur et envoi des données

Pour permettre à l'application de pouvoir communiquer avec le serveur, nous avons créé une classe spécifique permettant de gérer la connexion à un serveur. Cette classe est un "singleton", c'est à dire qu'il n'y aura qu'un seul objet Connexion créé grâçe à cette classe. Le singleton était ici necessaire, car la connexion doit être unique.


(Variables de la classe)

Cette classe déclare un certain nombre de variables, ipaddr s'occupe de conserver l'adresse du serveur , tandis que nous conservons le port de connexion dans port. isConnected conserve l'état de connection de l'application à une socket, par défaut, l'application n'est pas connecté. client contient la Socket de connexion du client. Cette Socket est nécessaire afin de définir un port de sortie des données.
Enfin, INSTANCE conservera l'unique instance de la classe Connexion, cette instance sera créé dès le premier appel de la méthode de classe getInstance().

Envoi de données

Quand un élément de l'application souhaite envoyer des données, elle doit appeller la méthode sendInfo(final String info). Cette méthode doit être appelé via l'instance de la classe, avec un appel de la forme : Connexion.getInstance().sendInfo(String les_donnees_a_envoyer).

Avant d'envoyer les données, l'application verifie si la socket client a bien été créé. Si ce n'est pas le cas, elle appelle la methode getConnexion().
Nous avons choisi d'utiliser le protocole UDP, ce qui permet d'envoyer des données sans qu'une connexion préalable soit nécéssaire.
Autre point important, Android exige que toute action sur le réseau soit effectué sur un thread autre que le thread principal de l'application.
De ce fait, chaque envoi de données doit se faire dans un nouveau thread.
Pour envoyer les données, nous devons créer un datagramme contenant les données (sous la forme d'un tableau d'octets), la taille des données, l'adresse du serveur, ainsi que son port.
De cette manière, l'application peut, via cette méthode, envoyer de manière efficace toute sorte de données n'importe quelle adresse définie au préalable.

Utilisation dans l'application

Dans notre application, cette methode d'envoi est utilisé dans la classe JoystickView, dans sa méthode onTouchEvent().

La méthode onTouchEvent() décrit comment le joystick doit réagir lorsqu'il est appuyé. Ici, nous récuperons uniquement le "radius" et envoyons cela dans la fonction sendCoordinates() qui préparera les données qui vont être envoyés. Le radius permet de connaitre les coordonnées max de x et y, afin de pouvoir calculer un pourcentage d'appui sur le joystick. C'est nécessaire car les coordonnées max ne sont pas fixes, elles varient en fonction de la taille du joystick. Il est donc nécessaire d'effectuer ces calculs, et de ne pas envoyer ces données "brutes".

La méthode sendCoordinates() calcule donc ce pourcentage pour x et y, et prépare les données, qui seront sous la forme "id_du_joystick|X:pourcentage_en_x|Y:pourcentage_en_y".

variables_app_android.png (4.95 KB) Nicolas Develet, 03/22/2015 04:35 PM

methode_envoi_donnees.png (10.1 KB) Nicolas Develet, 03/22/2015 04:52 PM

utilisation_envoi.png (28.2 KB) Nicolas Develet, 03/22/2015 09:07 PM