Bonjour.
Je cherche à faire communiquer un serveur tomcat et un appareil android.
Cependant les roles sont légèrement inversés dans le sens ou c'est l'android qui fait office de "serveur".
mon objectif est de transmettre un ensemble de données à partir du tomcat et de les transmettre au travers du réseau à l'android en sérialisant mes données.
Voici la méthode de sérialisation que j'ai coté serveur :
Je veux envoyer une Map : Map<String, Object> que je remplie avec ma methode export().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public static String serializeObject(Object o) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { ObjectOutput out = new ObjectOutputStream(bos); out.writeObject(o); out.close(); return bos.toString(); } catch(IOException ioe) { return null; } }
Du coté du serveur tomcat, cela s'envoie ainsi :
Du coté de l'android :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 try { socket = new Socket(clientPacket.getAddress().getHostAddress(), PORTECOUTE); PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); Map<String, Object> explist = export(); String serialisedobjects = serializeObject(explist); out.println(serialisedobjects); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
j'ai une methode pour déserialiser :
Enfin, la lecture du coté de l'appareil androidn (dans une AsyncTask appellée LocalServer ):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public static Object deserializeObject(String b) { try { ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b.getBytes())); Object object = in.readObject(); in.close(); return object; } catch(ClassNotFoundException cnfe) { Log.e("deserializeObject", "class not found error", cnfe); return null; } catch(IOException ioe) { Log.e("deserializeObject", "io error", ioe); return null; } }
La déserialisation se passe mal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 socket = serverSocket.accept(); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); String read = ""; Log.d(TAG, "Le serveur ANDROID a recu un message..."); while (input.ready()){ read = read + ""+ input.readLine(); } Log.d(TAG, "...de " + read.length() + " caractères."); Map<String, Object> serverdatas = null; serverdatas = (Map<String, Object>) deserializeObject(read); if (serverdatas != null && serverdatas.containsKey("groupes")){ Log.d(TAG, "Deserialisation avec succès. "); } else { Log.d(TAG, "Echec de la déserialisation."); } socket.close();
Voici l'erreur qui en est retournée
En envoyant juste une chaine de caractère sans sérialiser, cela fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 E/deserializeObject(1635): io error E/deserializeObject(1635): java.io.StreamCorruptedException E/deserializeObject(1635): at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2369) E/deserializeObject(1635): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:433) E/deserializeObject(1635): at com.project.network.LocalServer.deserializeObject(LocalServer.java:80) E/deserializeObject(1635): at com.project.network.LocalServer.doInBackground(LocalServer.java:61) E/deserializeObject(1635): at com.project.network.LocalServer.doInBackground(LocalServer.java:1) E/deserializeObject(1635): at android.os.AsyncTask$2.call(AsyncTask.java:185) E/deserializeObject(1635): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) E/deserializeObject(1635): at java.util.concurrent.FutureTask.run(FutureTask.java:138) E/deserializeObject(1635): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) E/deserializeObject(1635): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) E/deserializeObject(1635): at java.lang.Thread.run(Thread.java:1019) W/dalvikvm(1635): threadid=11: thread exiting with uncaught exception (group=0x40195560) E/AndroidRuntime(1635): FATAL EXCEPTION: AsyncTask #2 E/AndroidRuntime(1635): java.lang.RuntimeException: An error occured while executing doInBackground() E/AndroidRuntime(1635): at android.os.AsyncTask$3.done(AsyncTask.java:200) E/AndroidRuntime(1635): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) E/AndroidRuntime(1635): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) E/AndroidRuntime(1635): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) E/AndroidRuntime(1635): at java.util.concurrent.FutureTask.run(FutureTask.java:138) E/AndroidRuntime(1635): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) E/AndroidRuntime(1635): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) E/AndroidRuntime(1635): at java.lang.Thread.run(Thread.java:1019) E/AndroidRuntime(1635): Caused by: java.lang.NullPointerException E/AndroidRuntime(1635): at com.project.network.LocalServer.doInBackground(LocalServer.java:62) E/AndroidRuntime(1635): at com.project.network.LocalServer.doInBackground(LocalServer.java:1) E/AndroidRuntime(1635): at android.os.AsyncTask$2.call(AsyncTask.java:185) E/AndroidRuntime(1635): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) E/AndroidRuntime(1635): ... 4 more
Je me pose des questions :
- si je recupère bien l'ensemble de l'information recue par la socket (que le message n'est pas tronqué)
- Si je me mélange pas les pinceaux en travaillant avec des objets serialisés en String mais utilisant par moment des Bytes (avec ByteArrayInputStream et son jumeau opposé ^^)
Merci d'avance pour toute piste qui pourra me faire avancer.
Edit : Je pense m'etre planté dans la de/serialisation, la transmission d'une simple chaine de caractères sérialisée cette fois-ci reproduit l'erreur.
Partager