Connectivité, Web Services - JFOD

Transcription

Connectivité, Web Services - JFOD
Connectivité, Web Services
Orienté clients/serveur TCP et Bluetooth
jean-michel Douin, douin au cnam point fr
version : 26 Mars 2013
Notes de cours
Avertissement :
Android_Clients_Serveur
1
Bibliographie utilisée
http://developer.android.com/resources/index.html
http://developer.android.com/reference/android/os/AsyncTask.html
Un ensemble de tutoriels à lire
http://www.vogella.de/android.html
http://www.vogella.de/articles/AndroidPerformance/article.html
Android_Clients_Serveur
2
Sommaire
• Clients et serveurs TCP
– Un Client, une requête
– Serveur TCP (HTTP,…)
– Clients Bluetooth
• Annexes, cf. NFP121
– Format XML,
• API SAX
– Format JSON
• json.org
Android_Clients_Serveur
3
Client et serveur
• Serveurs TCP
– Exemples
– Requête
Android_Clients_Serveur
4
Serveurs
• En mode TCP
• Appels distants en mode TCP/IP
– Point à point avec accusé de réception
– telnet, ftp, http, …
Android_Clients_Serveur
5
URL …
• URL Uniform Resource Locator
une adresse sur internet
– http://jfod.cnam.fr
– http le protocole
– //jfod.cnam.fr le nom de la ressource
– http://jfod.cnam.fr:8999/ds2438/mesures.html
Android_Clients_Serveur
6
Exemples clients / serveurs
protocole
Client1
Client2
Client3
Serveur
1. Le client s’adresse au serveur
– Établit une connexion
2. Le serveur satisfait ses clients
– Mode synchrone, analogue à l’appel d’une méthode locale
Android_Clients_Serveur
7
Appels distants protocole « maison »
maison
JVM
Client1
JVM
Client2
Client3
serveur
• Le contexte
– Client Java, ou autres
– Serveur en java ou autre
– maison : //serveur/….
Android_Clients_Serveur
8
Appels distants protocole http
http
JVM
Client1
Client2
un
navigateur
JVM
serveur
• Le contexte
– Client Java(application comme applette), ou autres
– Un navigateur
– Serveur en java , ou autres
• http: //serveur/index.html
• Standard, universel …
Android_Clients_Serveur
9
Implémentation en Java
• Paquetage java.net
– Principales classes
•
•
•
•
•
ServerSocket
Socket
InetAddress
URLConnection
…
– Quelques lignes de sources suffisent …
Android_Clients_Serveur
10
usage de java.net
TCP/IP
JVM
JVM
Client1
Serveur
• 2 classes essentielles
Côté Serveur
– java.net.ServerSocket
• Méthode accept() sur une instance de la classe ServerSocket
Côté Client
– java.net.Socket, java.net.SocketAddress
• Envoi sur une instance de la classe Socket de données
Android_Clients_Serveur
11
Connexion / Principes
port
port
port
JVM
JVM
Serveur
Client1
•
Le Serveur attend une requête sur son port
– ServerSocket server = new ServerSocket(port)
– Socket socket = server.accept();
•
Dès la connexion établie,
– une instance de la classe Socket est engendrée sur un port temporaire
•
Établir une connexion par le client est effectuée par
– Socket s = new Socket(Serveur, port)
Android_Clients_Serveur
12
2 exemples
•
Serveur et client
1. Au protocole « maison »
•
•
Le serveur ne connaît que la commande « parle » et répond « bonjour »
Tout autre commande est ignorée !
2. Au protocole http
•
•
Android_Clients_Serveur
Seule la méthode GET /index.html HTTP1.0 est possible
Un sous-ensemble donc …
13
Exemple 1
JVM
Client1
maison: //serveur
parle
JVM
Serveur
bonjour
– Au protocole « maison »
•
•
Le serveur ne connaît que la commande « parle » et répond « bonjour »
Tout autre commande est ignorée !
– Client java ou autre
Android_Clients_Serveur
14
Un serveur avec un protocole « maison »
public class Serveur{
public static void main(String[] args) throws Exception{
ServerSocket serveur = new ServerSocket(5000);
while(true) {
Socket socket = serveur.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String cmd = in.readLine();
// parle !!!
DataOutputStream out = new DataOutputStream( socket.getOutputStream());
if(cmd.equals("parle")){
out.write("bonjour\n".getBytes());
}else{
out.write("commande inconnue ?\n".getBytes());
}
socket.close();
}
}
}
Android_Clients_Serveur
15
Le client « maison »
public class Client{
public static void main(String[] args) throws Exception{
Socket socket = new Socket("vivaldi.cnam.fr", 5000);
DataOutputStream out= new DataOutputStream( socket.getOutputStream());
out.write(args[0].getBytes());
out.write("\n".getBytes());
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
socket.close();
}
}
Android_Clients_Serveur
16
Un client « maison », telnet
• telnet localhost 5000
– parle // frappe sans écho
• petit outil utile : tcpview
Android_Clients_Serveur
17
Exemple 2
• Le protocole HTTP
– Les méthodes GET, POST, ….
• Mise en œuvre / démo
– Usage d’un client telnet sur un site existant
– Une application Java cliente
– Un serveur en java
Android_Clients_Serveur
18
Protocole HTTP
• HyperText Transfer Protocol
– Au dessus de TCP
• Les Méthodes
– GET /index.html
– HEAD
– POST
–
–
–
–
HTTP/1.0
PUT
DELETE
TRACE
CONNECT
– Voir http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
Android_Clients_Serveur
19
Côté serveur, méthode accept
ServerSocket listen = new ServerSocket(HTTP_PORT);
while(!stopped()){
try{
Socket socket = listen.accept();
handleRequest(socket);
}catch(Exception e){
}
}
listen.close();
}
listen.accept() est bloquant : au moins un client.
Android_Clients_Serveur
20
Exemple minimaliste !
• Un serveur Web au complet
– Un seul client, une seule requête !
• Extrait de
Android_Clients_Serveur
21
OneShot Httpd by Hendrik, j2se
public class OneShotHttpd {
protected static File docRoot;
public final static int HTTP_PORT = 8080;
public static void main(String argv[]){
try{
docRoot = new File(".");
ServerSocket listen = new ServerSocket(HTTP_PORT);
Socket client = listen.accept();
BufferedReader is = new BufferedReader(new
InputStreamReader(client.getInputStream()));
DataOutputStream os = new DataOutputStream(client.getOutputStream());
String request = is.readLine();
StringTokenizer st = new StringTokenizer(request);
if((st.countTokens() == 3) && st.nextToken().equals("GET")){
String filename = docRoot.getPath() + st.nextToken();
if(filename.endsWith("/") || filename.equals(""))
filename += "index.html";
File file = new File(filename);
sendDocument(os,file);
} else
System.err.println("400 Bad Request");
is.close(); os.close(); client.close();
}catch(IOException ioe){
System.err.println("Error: " + ioe.toString());
}}
Android_Clients_Serveur
22
OneShot « envoi du document »
public static void sendDocument(DataOutputStream out, File file) throws
IOException{
try{
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(file));
byte[] buf = new byte[1024];
int len;
while((len = in.read(buf,0,1024)) != -1)
{
out.write(buf,0,len);
}
in.close();
}
catch(FileNotFoundException fnfe)
{
System.err.println("404 Not Found");
}
}
}
Android_Clients_Serveur
23
OneShot avec Android
• AsyncTask<Params, Progress, Result>
Rappel
– Réalise une encapsulation d’un Thread et de l’accès à l’écran
• onPreExecute()
– Préambule, l’UI exécute cette méthode
• Void doInBackground(String… s){
OneShotHttpd.main(s);
• }
• onProgressUpdate(Progress…p)
– Mise à jour de l’UI à la suite de l’appel de publishProgress
• onPostExecute(Result)
– Mise à jour de l’UI à la fin de la méthode doInBackground
Android_Clients_Serveur
24
Côté serveur, un thread à chaque requête
ServerSocket listen = new ServerSocket(HTTP_PORT);
while(!stopped()){
try{
new Connection(listen.accept());
}catch(Exception e){
}
}
// création d’une instance
listen.close();
}
Chaque requête engendre la création d’une instance de la classe Connection
Et chaque instance créée engendre à son tour un « Thread »
Android_Clients_Serveur
25
Côté serveur, à chaque Connection un Thread
public class Connexion extends Thread{
…
public Connexion(Socket s){
this.s = s; start();
}
public void run(){
try{
BufferedReader is = new BufferedReader(
new InputStreamReader(s.getInputStream()));
DataOutputStream os =
new DataOutputStream(s.getOutputStream());
// analyse du contenu au bon protocole HTTP
// envoi du document
Android_Clients_Serveur
26
Côté serveur, accept « peut-être »
ServerSocket listen = new ServerSocket(HTTP_PORT);
listen.setSoTimeout(TIME_OUT);
while(!stopped()){
try{
new Connection(listen.accept());
}catch(SocketTimeoutException e){
// ici délai de garde échu
}catch(Exception e){
}
}
listen.close();
}
Par défaut l’appel de accept est bloquant
Méthode accept avec délai de garde
exception SocketTimeoutException à l’échéance
Android_Clients_Serveur
27
Schéma avec Un Pool de Thread
class WebServer { // 2004 JavaOneSM Conference
ThreadPool pool = new ThreadPool(7);
| Session 1358
public static void main(String[] args) {
ServerSocket socket = new ServerSocket(80);
while (true) {
final Socket s = socket.accept();
Runnable r = new Runnable() {
public void run() {
BufferedReader is = new BufferedReader(
new InputStreamReader(s.getInputStream()));
DataOutputStream os =
new DataOutputStream(s.getOutputStream());
// analyse du contenu au bon protocole HTTP
// envoi du document
}
};
pool.execute(r);
}
}}
Android_Clients_Serveur
28
Côté client
• Usage de telnet
• Requêtes GET et POST en Java
Android_Clients_Serveur
29
Requête GET avec telnet
• Un client telnet et un site du Cnam
– telnet
jfod.cnam.fr
80
• GET /index.html HTTP/1.0 ( frappe sans écho)
HTTP/1.0 200 OK
Last-Modified: Thu, 08 Feb 2007 14:55:29 GMT
Date: Thu, 08 Mar 2007 10:33:55 GMT
Server: Brazil/1.0
Content-Length: 7624
Content-Type: text/html
Connection: close
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
…..
Le résultat est retourné, le source du fichier index.html précédé de quelques informations
Android_Clients_Serveur
30
Requête GET en Java
• L’essentiel
– Créer une URL
– Ouvrir une connexion
• Écrire et lire sur les flots associés
• Classe java.net.URL
• Classe java.net.URLConnection
–
–
URL url = new URL("http://jfod.cnam.fr/index.html" );
URLConnection connection = url.openConnection();
Android_Clients_Serveur
31
Requête GET au complet
public void testGET()throws Exception{
URL url = new URL("http://jfod.cnam.fr/index.html" );
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String inputLine = in.readLine();
while(inputLine != null){
System.out.println(inputLine);
inputLine = in.readLine();
}
in.close();
}
Android_Clients_Serveur
32
Requête GET avec paramètres
public void testGET()throws Exception{
URL url =
new URL("http://jfod.cnam.fr:8999/ds2438/?listAll=on" );
URLConnection connection = url.openConnection();
connection.setDoInput(true);
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String inputLine = in.readLine();
while(inputLine != null){
System.out.println(inputLine);
inputLine = in.readLine();
}
in.close();
}
Android_Clients_Serveur
33
Requête POST
URL url = new URL("http://jfod.cnam.fr/index.html");
URLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.print("listAll=on");
out.close();
BufferedReader in = new BufferedReader( new
InputStreamReader(connection.getInputStream()));
String inputLine = in.readLine();
while(inputLine != null){
System.out.println(inputLine);
inputLine = in.readLine();
}
in.close();
Android_Clients_Serveur
34
Classes utiles
• InetAddress
– Adresse IP en « clair »
• URL
– Pour Uniform Resource Locator, sur le www
• URLConnection
– Une classe abstraite, super classe de toutes les classes établissant un
lien entre une application et une URL
– Sous-classes
• HttpURLConnexion, JarURLConnection
– Patron Fabrique afin d’écrire son propre gestionnaire de protocole
• Voir http://monge.univ-mlv.fr/~roussel/RESEAUJAVA/java.url2.html
• Méthode URLConnection.setContentHandlerFactory(
URLConnection.setContentHandlerFactory( …);
Android_Clients_Serveur
35
En résumé
•
Classe d’accès aux informations
– indépendante du protocole choisi
•
Lecture écriture en 7 étapes
1.
2.
3.
4.
5.
6.
7.
Après avoir créé l’URL
URL.
URL
Obtenir l’instance URLConnection.
URLConnection
Installer les capacités en sortie de cette instance de URLConnection.
URLConnection
Ouvrir le flot en entrée.
Obtenir le flot en sortie.
Écrire sur ce flot.
Fermer celui-ci.
Android_Clients_Serveur
36
Android
• Android
– Toute requête doit être effectuée en dehors de l’UIThread:
– En conséquence, usage de
• AsyncTask
• Service + Thread
Android_Clients_Serveur
37
En « rappel »
Android_Clients_Serveur
le cycle de vie
38
En Rappel: AsyncTask<Params, Progress, Result>
Avec la classe,
AsyncTask<Params, Progress, Result>
– http://developer.android.com/reference/android/os/AsyncTask.html
• Nous avons
– Un thread et l’accès à l’UIThread
• Un thread : pour le traitement en tâche de fond
• Une mise à jour de l’UI incluse
• Les paramètres génériques sont
– Params type des paramètres transmis au Thread
– Progress type des paramètres en cours de traitement transmis au Handler
– Result type du résultat pour l’appelant
Android_Clients_Serveur
39
Résumé: AsyncTask<Params, Progress, Result>
• Depuis l’UIThread
– création d’une instance et appel de la méthode execute
• Exemple new WebAsyncTask().execute(url1, url2, url3);
• AsyncTask<Params, Progress, Result>
– Réalise une encapsulation d’un Thread et de l’accès à l’écran
Méthodes
• onPreExecute()
– Préambule, l’UI exécute cette méthode
• Result doInBackground(Params…p)
– Le contenu de cette méthode s’exécute dans un autre Thread
• onProgressUpdate(Progress…p)
– Mise à jour de l’UI à la suite de l’appel de publishProgress
• onPostExecute(Result)
– Mise à jour de l’UI à la fin de la méthode doInBackground
Android_Clients_Serveur
40
AsyncTask et réseau, exemples
•
Lire une page sur le web HTTP, requête GET
– private class LirePageHTML extends AsyncTask<String,Void,String>{
Schéma
onPreExecute
Afficher une fenêtre d’informations, ProgressDialog
doInBackGround
Ouvrir une connexion, avec un échec éventuel
onPostExecute
Informer l’utilisateur
Android_Clients_Serveur
41
Lire une page Web www.cnam.fr
• Si j’ai la permission … de naviguer sur le web
– <uses-permission android:name="android.permission.INTERNET"></uses-permission>
– Une IHM simple
– L’accès au web est une opération coûteuse alors héritons de AsyncTask
Android_Clients_Serveur
42
Une classe interne héritant de AsyncTask
protected String doInBackground(String... args) {
builder = new StringBuilder();
try {
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(args[0]);
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader =
new BufferedReader( new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {error = "Failed to download file";}
} catch (Exception e) {error = e.getMessage();}
return builder.toString();}
Android_Clients_Serveur
43
Autres exemples, essai d’architecture
• 1) Ouverture d’une connexion TCP
– Obtention d’un flux (OutputStream)
– Le flux reste ouvert
• 2) Envois de données sur le flux
– En fonction des opérations de l’utilisateur
• Règle :
l’ouverture de la connexion et l’envoi de données se font sur des threads
• Une solution :
– Ouverture d’une connexion TCP : dans une sous classe d’AsyncTask
– Envoi de données : dans un thread en attente sur une file (SynchronousQueue)
– java.util.concurrent.SynchronousQueue
Android_Clients_Serveur
44
Un schéma d’une architecture possible
UIThread
1) Obtention de la connexion
AsyncTask
2) Envoi de données
offer
Un Thread
take
SynchronousQueue
Réseau
Android_Clients_Serveur
45
Obtention de la connexion, AsyncTask
protected void onPreExecute() {
dialog = ….);
}
protected DataOutputStream doInBackground(String... args) {
boolean result = true;
try{
InetAddress addr = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
int timeout = Integer.parseInt(args[2]);
SocketAddress sockaddr = new InetSocketAddress(addr, port);
this.socket = new Socket();
socket.connect(sockaddr, timeout);
out= new DataOutputStream(socket.getOutputStream());
}catch(Exception e){ erreur = e.getMessage();result= false;}
return out;
}
Android_Clients_Serveur
46
Envoi de données depuis l’UIThread
// ici à chaque clic des données sont envoyées vers la file
// les boutons de l’IHM contiennent la commande à envoyer au serveur
public void onClickCommand(View v){
String cmd = v.getContentDescription().toString() + "\n";
try {
sender.offer(cmd.getBytes());
} catch (Exception e) {
}
}
UIThread
Android_Clients_Serveur
offer
47
Envois de données, vers la file
public class Sender extends Thread{
private BlockingQueue<byte[]> queue;
public Sender(){
queue = new SynchronousQueue<byte[]>();
this.start();
}
public boolean offer(byte[] cmd){
return queue.offer(cmd);
}
public void close(){
this.interrupt();
}
public void run(){
while(!isInterrupted()){
try {
byte[] cmd = queue.take(); // lecture bloquante
out.write(cmd);
}catch (Exception e) {
}}
}
Android_Clients_Serveur
48
Une connexion Bluetooth
• Recherche d’un périphérique bluetooth aux alentours
– Hypothèse : Nous connaissons l’adresse physique du périphérique
• 00-19-EF-01-17-9C (obtenu ipconfig /all sous windows)
– Cette recherche doit s’effectuer dans un thread
• Alors héritons de AsyncTask
• Au clic
– new ConnexionBT().execute("00:19:EF:01:17:9C");
private class ConnexionBT extends AsyncTask<String,String,BluetoothSocket>{
protected void onPreExecute() {
protected BluetoothSocket doInBackground(String... args) {
protected void onPostExecute(BluetoothSocket btSocket) {
Android_Clients_Serveur
49
onPreExecute : Patience, doInBackground : Recherche
protected void onPreExecute() {
dialog = ProgressDialog.show(BTClientActivity.this,
"connexion Bluetooth", " patientez ", true);
}
protected BluetoothSocket doInBackground(String... args) {
try{
this.btDevice = btAdapter.getRemoteDevice(args[0]);
btSocket =
btDevice.createRfcommSocketToServiceRecord(MY_UUID);
btAdapter.cancelDiscovery();
btSocket.connect();
}catch(Exception e){
erreur = e.getMessage();
btSocket= null;
}
return btSocket;
}
Android_Clients_Serveur
50
onPostExecute(BluetoothSocket btSocket)
protected void onPostExecute(BluetoothSocket btSocket) {
try {
os = btSocket.getOutputStream();
//
} catch (IOException e) {
erreur = e.getMessage();
e.printStackTrace();
}finally{
dialog.dismiss();
}
}
Android_Clients_Serveur
51
Première conclusion
• Serveurs et service
• Client et lecture de flux au format XML et JSON
– XML, SAX rappels cf. supports NFP121
– JSON
Android_Clients_Serveur
52
SAX
SAX Objects
XML Document
<?xml version=“1.0”?>
Parser
startDocument
<addressbook>
Parser
startElement
<name>John Doe</name>
Parser
startElement & characters
<email>[email protected]</email>
Parser
startElement & characters
</person>
Parser
endElement
<person>
Parser
startElement
<name>Jane Doe</name>
Parser
startElement & characters
<email>[email protected]</email>
Parser
startElement & characters
Parser
endElement
Parser
endElement & endDocument
<person>
</person>
</addressbook>
Android_Clients_Serveur
53
Implémenter les Handlers d'évènements du parseur
DefaultHandler
Il implémente ces
différents Handler
avec des méthodes
vides, de sorte que l'on
peut surcharger
seulement celles qui
nous intéressent.
Android_Clients_Serveur
54
org.xml.sax.ContentHandler
Toutes
les applications SAX doivent implanter un ContentHandler
Méthodes
:
–public
void startDocument()
startDocument throws SAXException
–public
void endDocument()
endDocument throws SAXException
–public
void startElement(String
nspURI, String localName, String qName,
startElement
Attributes atts) throws SAXException
–public
void characters(char[]
ch, int start, int length) throws SAXException
characters
–…
Android_Clients_Serveur
55
Un exemple: les stations Vélib
– http://www.velib.paris.fr
– http://www.velib.paris.fr/service/carto
– http://www.velib.paris.fr/service/stationdetails/{number}
Android_Clients_Serveur
56
http://www.velib.paris.fr/service/carto
<carto>
<markers>
<marker name="00901 - STATION MOBILE 1" number="901"
address="ALLEE DU BELVEDERE PARIS 19 - 0 75000 Paris -"
fullAddress="ALLEE DU BELVEDERE PARIS 19 - 0 75000 Paris 75000 PARIS" lat="48.892745582406675"
lng="2.391255159886939" open="1" bonus="0"/>
<marker name="03011 - TURBIGO" number="3011" address="55 RUE
TURBIGO -" fullAddress="55 RUE TURBIGO - 75003
PARIS" lat="48.86558781525867"lng="2.356094545731025" open
="1" bonus="0"/>
Analyse des attributs
de la balise marker
en SAX -> méthode startElement
Android_Clients_Serveur
57
http://www.velib.paris.fr/service/stationdetails/3011
<station>
<available>21</available>
<free>10</free>
<total>31</total>
<ticket>1</ticket>
</station>
Analyse du contenu
de la balise station
en SAX -> des méthodes startElement, endElement, characters
Android_Clients_Serveur
58
Les stations Vélib: suite
• Les Classes, un premier découpage
– StationVelib,
• toutes les infos d’une station, (adresse, longitude, latitude,…)
– InfoStation,
• les informations comme le nombre de vélo et d’emplacements disponibles,...
– ListeDesStationsVelib
• La gestion de la liste des stations
– http://www.velib.paris.fr/service/carto
– http://www.velib.paris.fr/service/stationdetails/{number}
Android_Clients_Serveur
59
Initialisation du « parser »
class ParserXML
extends DefaultHandler {
public ParserXML(InputStream in)
throws Exception{
SAXParserFactory spf =
SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(this);
xr.parse(new InputSource(in));
}
Android_Clients_Serveur
60
startElement un extrait
// Création d’une instance de la classe StationVelib
// depuis XML en Java
public void startElement(String uri, String localName, String qName,Attributes
attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if(qName.equals("marker")){
StationVelib station = new StationVelib();
station.setName(attributes.getValue("name"));
station.setNumber(Integer.parseInt(attributes.getValue("number")));
station.setAddress(attributes.getValue("address"));
station.setLatitude(Double.parseDouble(attributes.getValue("lat")));
station.setLongitude(Double.parseDouble(attributes.getValue("lng")));
}
Android_Clients_Serveur
61
Une Info à chaque Station
class ParserXML extends DefaultHandler {
private StringBuffer current; // la valeur
public ParserXML(int ID){
URL url = new URL(URL_VELIB_INFO + ID);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp;
sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(this);
xr.parse(new InputSource(url.openStream()));
}
Android_Clients_Serveur
62
A chaque noeud
public void startElement (String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
current = new StringBuffer();
}
public void characters (char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
current.append(new String(ch, start, length));
}
public void endElement (String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if(qName.equals("available")){
available = Integer.parseInt(current.toString());
…
}
Android_Clients_Serveur
63
XML plutôt verbeux, JSON plutôt concis
• JSON JavaScript Object Notation
– www.json.org/
– JSONArray
– JSONObject
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put( "name", "paul");
jsonObject.put("number", 1900);
jsonArray.put(jsonObject);
// pierre idem
System.out.println(jsonArray.toString(2));
Android_Clients_Serveur
64
JSON, exemple paul et pierre
• [
• {
•
"name": "paul",
•
"number": 1900
• },
• {
•
"name": "pierre",
•
"number": 1900
• }
• ]
Android_Clients_Serveur
65
JSON Lecture
InputStream in = …;
Reader r = new InputStreamReader(in);
BufferedReader br = new BufferedReader(r);
StringBuffer sb = new StringBuffer();
String str;
while((str = br.readLine()) != null) {
sb.append(str);
}
r.close();
JSONArray jsonarray = new JSONArray(sb.toString());
JSONObject jsonObject = (JSONObject)jsonStations.get(i);
Auditeur a = new Auditeur ();
a.setName(jsonObject.getString("name"));
…
Android_Clients_Serveur
66
StationVelib, lecture JSON
JSONArray jsonStations = new JSONArray(sb.toString());
for(int i=0; i< jsonStations.length(); i++){
JSONObject jsonObject = (JSONObject)jsonStations.get(i);
StationVelib st = new StationVelib();
st.setName(jsonObject.getString("name"));
st.setNumber(jsonObject.getInt("number"));
st.setAddress(jsonObject.getString("address"));
st.setFullAddress(jsonObject.getString("fullAddress"));
st.setLatitude(jsonObject.getDouble("lat"));
st.setLongitude(jsonObject.getDouble("lng"));
st.setOpen(jsonObject.getBoolean("open"));
st.setBonus(jsonObject.getBoolean("bonus"));
Android_Clients_Serveur
67
Démonstration
Android_Clients_Serveur
68
Conclusion
• Discussions
Android_Clients_Serveur
69

Documents pareils

TP 5 : Programmation réseau en Java

TP 5 : Programmation réseau en Java FileInputStream fi = new FileInputStream(fichier); InputStreamReader isr = new InputStreamReader(fi); BufferedReader br = new BufferedReader(isr); String chaineLue = br.readLine(); System.out.print...

Plus en détail

6 par feuille

6 par feuille write (b : byte[], off : int, len : int) : void writeInt (v : int) : void writeChar (v : int) : void writeLong (v : long) : void writeByte (v : int) : void writeFloat (v : float) : void writeShort ...

Plus en détail