Ответ 1
Убедитесь, что сообщение на стороне сервера - rusl.online.examination.system.client.utility.Message
. Кажется, это не так.
У меня есть два проекта Java-netbeans, один из которых является другим сервером. У меня есть класс сообщений, который я создал, который я хочу передать на сервер, и обратный путь к клиенту после изменения, сделанного на сервере. Я включил класс Message в оба проекта. Я использую ObjectOutputStream
и ObjectInputStream
для передачи объекта. Соединение между сервером и клиентом в порядке, и объект проходит через, но на сервере, когда я читаю объект из ObjectInputStream
с помощью readObject()
который я readObject()
его классу Message
. Но ClassNotFoundException выбрасывается на сервере. Он не может найти класс Message. Как я могу это решить?
Код для клиента:
public void startClient() {
try {
// Create the socket
Socket clientSocket = new Socket(HOST, PORT);
// Create the input & output streams to the server
ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream());
// Read modify
// TODO here
/* Create The Message Object to send */
LinkedList<Message> msgList = new LinkedList<>();
Message msg = new Message();
msg.setMessage("Kasun");
msg.setIndex(1);
msg.setAverage(5.5f);
msgList.push(msg);
/* Send the Message Object to the server */
outToServer.writeObject(msgList);
/* Retrive the Message Object from server */
LinkedList<Message> inFromServerList = new LinkedList<>();
Message msgFrmServer = null;
inFromServerList = (LinkedList<Message>)inFromServer.readObject();
msgFrmServer = inFromServerList.pop();
/* Print out the recived Message */
System.out.println("Message: " + msgFrmServer.getMessage());
System.out.println("Index: " + msgFrmServer.getIndex());
System.out.println("Average: " + msgFrmServer.getAverage());
clientSocket.close();
} catch (Exception e) {
System.err.println("Client Error: " + e.getMessage());
System.err.println("Localized: " + e.getLocalizedMessage());
System.err.println("Stack Trace: " + e.getStackTrace());
}
}
Код для сервера
public void startServer() {
try {
ServerSocket welcomeSocket = new ServerSocket(PORT);
while (true) {
// Create the Client Socket
Socket clientSocket = welcomeSocket.accept();
System.out.println("Socket Extablished...");
// Create input and output streams to client
ObjectOutputStream outToClient = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream inFromClient = new ObjectInputStream(clientSocket.getInputStream());
// Read modify
// TODO here
/* Create Message object and retrive information */
LinkedList<Message> inList = new LinkedList<>();
Message inMsg = null;
inList = (LinkedList<Message>)inFromClient.readObject();
inMsg = inList.pop();
/* Modify the message object */
inMsg.setMessage(inMsg.getMessage().toUpperCase());
inMsg.setIndex(5);
inMsg.setAverage(10.5f);
/* Send the modified Message object back */
outToClient.writeObject(inMsg);
}
} catch (Exception e) {
System.err.println("Server Error: " + e.getMessage());
System.err.println("Localized: " + e.getLocalizedMessage());
System.err.println("Stack Trace: " + e.getStackTrace());
System.err.println("To String: " + e.toString());
}
}
Исключение, выведенное на "сервере",
java.lang.ClassNotFoundException: rusl.online.examination.system.client.utility.Message
Должен ли я использовать java RMI? Есть ли решение для этого без использования RMI?
Убедитесь, что сообщение на стороне сервера - rusl.online.examination.system.client.utility.Message
. Кажется, это не так.
Если вы отправляете объекты класса через сокет. Чтобы воспроизвести объект на другом конце, вам нужно отбросить объект. Для этого вам потребуется определение класса на обоих концах.
Убедитесь, что вы правильно импортировали тот же класс Message
для серверной программы, который вы использовали для создания сообщения.