2010-07-29 6 views
0

J'ai un client qui envoie un objet de classe au serveur. Le serveur doit appeler les méthodes de cette classe et renvoyer le résultat. Je reçois l'exception suivante java.lang.ClassNotFoundException: newclient.TestObject lorsque j'exécute mon programme.Le serveur Java ne reçoit pas d'objet du client

server.java:

package newserve; 

import java.net.*; 
import java.io.*; 
import java.lang.reflect.*; 

public class SERVER { 
    public static void main(String[] args) { 
    int port = 9876; 
     try { 
      ServerSocket ss = new ServerSocket(port); 
     Socket s = ss.accept(); 

      InputStream is = s.getInputStream(); 
     ObjectInputStream ois = new ObjectInputStream(is); 

     //read the first object from the socket 
     Object o1 = /*(Object)*/ois.readObject(); 

      //Handling the first received object 
     if (o1 != null){ 
     System.out.println("\nFROM SERVER - receiving class: " + 
             o1.getClass().getName()); 
    System.out.println("\nWith these methods: \n"); 

    //get all the methods into an array 
    Method[] methods = o1.getClass().getDeclaredMethods(); 

    //print the methods 
    for(int i = 0; i < methods.length; i++) 
     System.out.println(methods[i]); 

    //invoking the first method with default constructor 
    Object a = methods[0].invoke(o1.getClass().newInstance(), 
              new Object[] {3, 5}); 

    System.out.println("\nOutput of the first method: " + a); 
    } 

    //read the second object from the socket 
    Object o2 = ois.readObject(); 
    System.out.println("\n\nFROM SERVER - receiving class: " + 
             o2.getClass().getName()); 
    System.out.println("\nWith these: " + o2); 

    //close everything and shut down 
    is.close(); //close input stream 
    s.close(); //close the socket 
    ss.close(); //close the server's socket 

}catch(Exception e){System.out.println(e);} 
} 

}

client.java:

package newclient; 

import java.net.*; 
import java.io.*; 

public class CLIENT { 
    public static void main(String[] args) { 
     int port = 9876; 
    try{ 
     Socket s = new Socket("localhost", port); 
     OutputStream os = s.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os); 

     Object to = new TestObject(); //create a new object 

     oos.writeObject(to); //send the object to the server 

     // create a new String object and send 
     oos.writeObject(new String("A String object from client")); 

     //close the connection 
     oos.close(); 
     os.close(); 
     s.close(); 
    }catch(Exception e){System.out.println(e);} 
    } 
} 

TestObject.java:

package newclient; 

import java.io.*; 

/** 
* A test object to send via socket 
*/ 
class TestObject implements Serializable { 
    static final long serialVersionUID = 0; 
    //constructor 
    public TestObject(){};//default constructor 

    //method 
    public int add(int a, int b){return a+b;} 
    public int sub(int a, int b){ return a-b;} 
} 

Merci!

+0

Le test de null est inutile, sauf si vous envisagez d'écrire des valeurs nulles. – EJP

Répondre

2

Votre serveur aura besoin de newclient.TestObject.class dans son chemin de classe.

Votre structure de répertoire doit être quelque chose comme ceci:

 
(CWD) 
├── newclient 
│   ├── CLIENT.class 
│   └── TestObject.class 
└── newserver 
    └── SERVER.class 

Où CWD est le répertoire de travail courant. Vous devez rester dans ce répertoire supérieur et exécuter

java -classpath . newserver.SERVER 
+0

comment ajouter newclient.TestObject.class à son chemin de classe? – Atiya

0

Je suppose que les programmes client et serveur s'exécutent sur des machines différentes. Puis, comme nous l'avons dit, vous devez ajouter au chemin de classe du serveur.

Votre client devrait ressembler à ceci

(CWD) 
├── newclient 
│ ├── CLIENT.class 
│ └── TestObject.class 

et vous devriez commencer comme ça

java -classpath . newclient.CLIENT.class 

Votre serveur devrait ressembler à ceci (notez qu'il a besoin TestObject.class)

(CWD) 
├── newclient 
│ └── TestObject.class 
└── newserver 
    └── SERVER.class 

et vous devriez le commencer comme ça

java -classpath. newserver.CLIENT.class

Questions connexes