Подтвердить что ты не робот

Отправка объекта через сокет в java

У меня есть два проекта 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?

4b9b3361

Ответ 1

Убедитесь, что сообщение на стороне сервера - rusl.online.examination.system.client.utility.Message. Кажется, это не так.

Ответ 2

Если вы отправляете объекты класса через сокет. Чтобы воспроизвести объект на другом конце, вам нужно отбросить объект. Для этого вам потребуется определение класса на обоих концах.

Убедитесь, что вы правильно импортировали тот же класс Message для серверной программы, который вы использовали для создания сообщения.