Erreur incompréhensible à la transmission d'un objet via Socket
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 :
- Pourquoi eclipse me dit qu'il ne trouve pas l'objet XroidJob alors qu'il figure bien dans chaque projet ?
- 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:
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:
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:
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:
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:
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();
}
...
} |