Exemple de communication client - server • • • • Avec des implémentations de socketIO en java Communication Asynchrone (callback) Threads « masqués » Protocoles (échange des messages, contenus des JSON) à déterminer Côté Serveur https://github.com/mrniko/nettysocketio SocketIOServer Le programme ne doit pas s’arrêter (par exemple, dormir jusqu’à « toujours »). c.f. cours sur les threads dans maven repository Côté serveur : Dépendence « maven » <dependencies> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.7</version> </dependency> </dependencies> SocketIOServer : Création d’un serveur avec une adresse et un port // config com.corundumstudio.socketio.Configuration; Configuration config = new Configuration(); config.setHostname("127.0.0.1"); config.setPort(10101); // creation du serveur server = new SocketIOServer(config); SocketIOServer : écoute d’événements onDisconnect(SocketIOClient • // abonnemement server.addConnectListener(this); arg0) onConnect(SocketIOClient arg0) server.addDisconnectListener(this); Nom du message Mapping message JSON / classe JAVA server.addEventListener("query", AddressQuery.class, this); onData(SocketIOClient arg0, AddressQuery arg1, AckRequest arg2) Exemple de mapping JSON - JAVA public class AddressQuery { { address : "une valeur" } private String address; public AddressQuery() { } public AddressQuery(String addresse) { super(); /* mapping JSON avec la classe : l'attribut (et les setter/getter) avec le champ JSON via introspection*/ this.address = address; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } Emettre un message • Méthode sendEvent de SocketIOClient • 1er paramètre : le nom du message (string) • 2e paramètre : un objet java « mapping » • En réponse à la connexion, à la réception d’un message… • Envoi à tous via getBroadcastOperations() de SocketIOServer • Idem : méthode sendEvent • Liste des connexions via getAllClients() de SocketIOServer Côté client (android) https://github.com/socketio/sock et.io-client-java io.socket.client.Socket Thread masqué (attention pour la mise à jour) c.f. cours sur les threads dans maven repository Une implémentation java du client • Même librairie pour java « desktop » et pour « android » • Dépendance • graddle : compile ('io.socket:socket.io-client:0.8.3') { exclude group: 'org.json', module: 'json' } // car cela est dans le java android • maven : <dependency> <groupId>io.socket</groupId> <artifactId>socket.io-client</artifactId> <version>0.8.3</version> </dependency> Dans android : connexion / écoute • Se déconnecter dans onPause • Et se désabonner des messages (« off ») • Se (re)connecter quand nécessaire ou dans onResume • Création : Socket mSocket = IO.socket(serverAddress); //"http://192.168.1.23:10101"; //connexion mSocket.connect(); // abonnement aux messages « map » via // Emitter.Listener mSocket.on("map", this); // pour annuler : mSocket.off("map"); Emitter.Listener --> call(Object... args) avec en 1er paramètre le JSON reçu Emettre un message JSONObject obj = new JSONObject(); try { obj.put("nom attribut json", valeur); // etc. } catch (JSONException e) { e.printStackTrace(); } mSocket.emit("nom_message", obj);