tags:

views:

36

answers:

2

I have a client that sends a class object to the server. The server should invoke the methods of that class and return the result. I am getting the following exception java.lang.ClassNotFoundException: newclient.TestObject when I run my program.

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;}
}

Thank You!

+2  A: 

Your server will need newclient.TestObject.class in its classpath.

Your directory structure should be something like this:

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

Where CWD is the current working directory. You should stand in that top directory and run

java -classpath . newserver.SERVER
nos
how do I add newclient.TestObject.class to its classpath?
Atiya
A: 

I assume that the client and server programs are running on different machines. Then as nos said you need to add to the classpath of the server.

Your client should look like this

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

and you should start it like this

java -classpath . newclient.CLIENT.class

Your server should look like this (note it needs TestObject.class)

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

and you should start it like this

java -classpath . newserver.CLIENT.class

emory