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!
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
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.