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 :
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; 
	} 
}
Je veux envoyer une Map : Map<String, Object> que je remplie avec ma methode export().

Du coté du serveur tomcat, cela s'envoie ainsi :
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();
	}
Du coté de l'android :
j'ai une methode pour déserialiser :
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; 
	    } 
	  }
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
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();
La déserialisation se passe mal.
Voici l'erreur qui en est retournée
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
En envoyant juste une chaine de caractère sans sérialiser, cela fonctionne.
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.