Bonjour à tous,

J'ai 2 applications Client/Serveur (donc 2 projets sous eclipse) qui communiquent via Socket TCP/IP.

Je n'arrive pas à transmettre un objet via le Socket. L'application Client parvient à écrire l'objet dans le Socket, mais l'application Serveur n'arrive pas à lire l'objet reçu.

L'application Client : TabletRemoteControl.java
L'application Serveur : XroidMediaPlayer.java
La classe qui envoi l'objet :JobWriter.java
La classe qui reçoit l'objet : JobReader.java
L'objet : XroidJob.java

Nota : La classe qui définit l'objet figure dans les 2 projets.

Mes questions :
  1. Pourquoi eclipse me dit qu'il ne trouve pas l'objet XroidJob alors qu'il figure bien dans chaque projet ?
  2. Pourquoi eclipse cherche la classe XroidJob dans com.jBidouille.Tablet.Communication.Job.XroidJob alors qu'on se trouve dans le projet côté serveur (donc Xroid) ?


Merci d'avance pour vos lumières.


Voici le LogCat côté Serveur (XroidMediaPlayer.java):

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
32
33
34
35
36
37
I/DEBUG(224): [Xroid] <WAIT> JobReader attend l.arrivée d.un nouveau Job
W/System.err(224): java.lang.ClassNotFoundException: com.jBidouille.Tablet.Communication.Job.XroidJob
W/System.err(224): 	at java.lang.Class.classForName(Native Method)
W/System.err(224): 	at java.lang.Class.forName(Class.java:237)
W/System.err(224): 	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2604)
W/System.err(224): 	at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1860)
W/System.err(224): 	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:840)
W/System.err(224): 	at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2080)
W/System.err(224): 	at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254)
W/System.err(224): 	at com.jBidouille.Xroid.Communication.Job.JobReader.run(JobReader.java:64)
W/System.err(224): 	at java.lang.Thread.run(Thread.java:1096)
W/System.err(224): Caused by: java.lang.NoClassDefFoundError: com.jBidouille.Tablet.Communication.Job.XroidJob
W/System.err(224): 	... 11 more
W/System.err(224): Caused by: java.lang.ClassNotFoundException: com.jBidouille.Tablet.Communication.Job.XroidJob in loader dalvik.system.PathClassLoader@44c07938
W/System.err(224): 	at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
W/System.err(224): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
W/System.err(224): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
W/System.err(224): 	... 11 more
I/DEBUG(224): [Xroid] <WAIT> JobReader attend l.arrivée d.un nouveau Job
W/System.err(224): java.io.OptionalDataException
W/System.err(224): 	at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:966)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254)
W/System.err(224): 	at com.jBidouille.Xroid.Communication.Job.JobReader.run(JobReader.java:64)
W/System.err(224): 	at java.lang.Thread.run(Thread.java:1096)
I/DEBUG(224): [Xroid] <ERR> JobReader détecte que Tablet n.écoute plus sur InputStream mais ne lève pas d.événement
I/DEBUG(224): [Xroid] <WAIT> JobReader attend l.arrivée d.un nouveau Job
W/System.err(224): java.io.OptionalDataException
W/System.err(224): 	at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:966)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299)
W/System.err(224): 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254)
W/System.err(224): 	at com.jBidouille.Xroid.Communication.Job.JobReader.run(JobReader.java:64)
W/System.err(224): 	at java.lang.Thread.run(Thread.java:1096)
I/DEBUG(224): [Xroid] <ERR> JobReader détecte que Tablet n.écoute plus sur InputStream mais ne lève pas d.événement
I/DEBUG(224): [Xroid] <WAIT> JobReader attend l.arrivée d.un nouveau Job
Voici la classe côté Client (Tablet) qui envoi l'objet XroidJob (JobWriter.java) :

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.jBidouille.Tablet.Communication.Job;
 
import java.io.IOException;
import java.io.ObjectOutputStream;
 
public class JobWriter implements Runnable{
 
	private ObjectOutputStream outputStream;
	private XroidJob writerMessage;
	private Boolean isMessageReady = false;
	private volatile Thread currentThread = null;		
 
	public JobWriter(ObjectOutputStream out) {
		this.outputStream = out;
	}
 
	public void doStop(){
		currentThread.interrupt();
	}
 
	public void setMessage (XroidJob job){
 
		if (job != null) {
			writerMessage = job;
			this.isMessageReady = true;
		}
 
	}
 
	public void run() {
 
		currentThread = Thread.currentThread();	
 
		try{
 
			while(!currentThread.isInterrupted()){
 
				if (this.isMessageReady){
 
					try {
 
						outputStream.writeObject(writerMessage);
						outputStream.flush();	
 
					} catch (IOException e) {
						e.printStackTrace();
					}	
 
					this.isMessageReady = false;
 
				}
 
				Thread.sleep(1000);
			}
 
		} catch (InterruptedException e){
			e.printStackTrace();
		}	
 
		try {
			outputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}		
 
	}	
 
}
Voici la classe côté Serveur (Xroid) qui récupère l'objet XroidJob (JobReader.java) :

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.jBidouille.Xroid.Communication.Job;
 
import java.io.IOException;
import java.io.ObjectInputStream;
import android.util.Log;
 
public class JobReader implements Runnable{
 
	ObjectInputStream inputStream;
	private XroidJob readerMessage;
	private volatile Thread currentThread = null;
 
	public JobReader(ObjectInputStream in){
		this.inputStream = in;
	}
 
	public void doStop(){
		currentThread.interrupt();
	}
 
	public void run() {
 
		currentThread = Thread.currentThread();
 
		try{
 
			while(!currentThread.isInterrupted()){
 
				try {
 
					Log.i("DEBUG", "[Xroid] <WAIT> JobReader attend l'arrivée d'un nouveau Job");				
 
					readerMessage = (XroidJob)inputStream.readObject();
 
					Log.i("DEBUG", "[Xroid] JobReader a reçu le Job ID " + readerMessage.getJobID());
 
			    } catch (IOException e) {
 
			    	e.printStackTrace();
 
			    	Log.i("DEBUG", "[Xroid] <ERR> JobReader détecte que Tablet n'écoute plus sur InputStream mais ne lève pas d'événement");		
 
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
 
				Thread.sleep(1000);
			}
 
		} catch (InterruptedException e){
			e.printStackTrace();
		}
 
		try {
			inputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
 
	}	
 
}
Le fameux objet côté Serveur (Xroid) :

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
package com.jBidouille.Xroid.Communication.Job;
 
import java.io.Serializable;
import java.util.UUID;
 
public class XroidJob implements Serializable{
 
	private String jobID;
	private int[] playList; 
	private Boolean isRandom;
	private Boolean isLooping;
 
	public XroidJob(){
 
		jobID = UUID.randomUUID().toString();
	}
...
 
}
Le fameux objet côté Client (Tablet) :

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
package com.jBidouille.Tablet.Communication.Job;
 
import java.io.Serializable;
import java.util.UUID;
 
public class XroidJob implements Serializable{
 
	private String jobID;
	private int[] playList; 
	private Boolean isRandom;
	private Boolean isLooping;
 
	public XroidJob(){
 
		jobID = UUID.randomUUID().toString();
	}
...
 
}