Почему я получаю ClassNotFoundException с ObjectInputStream.readObject ()? - PullRequest
0 голосов
/ 16 января 2019

Следующий код клиента принимает объект «Гость» с сервера:

protected static void sendLoginRequest(String email, String password) {
    try(
        Socket socket = new Socket("127.0.0.1", 44444);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    ){
        out.write("LGNR");
        out.flush();
        out.newLine();
        out.flush();

        out.write(email);
        out.flush();
        out.newLine();
        out.flush();            

        out.write(password);
        out.flush();
        out.newLine();
        out.flush();

        in.ready();
        switch(in.readLine()) {
        case "SU":
            Guest g = null;
            try(ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());){
                g = (Guest) ois.readObject();
            }catch(ClassNotFoundException | IOException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
            GuestProfileMenu.generateMenu(g);
            break;
        case "WP":
            System.out.println("Invalid Password.");
            break;
        case "IE":
            System.out.println("Email not found.");
            break;
        }

    }catch(IOException e) {
        System.out.println("No response from Server.");
        System.out.println(e.getMessage());
    }
}

А на стороне сервера это выглядит так:

private void userLogin(Socket socket, BufferedReader in, BufferedWriter out) {
    System.out.println(socket.getInetAddress().getHostName() + ":" + socket.getLocalPort() + " - has sent a login request.\r\n");

    FileManager.openGuestFile();
    ArrayList<Guest> gList = FileManager.getGuestList();

    try{
        in.ready();
        String email = in.readLine();
        System.out.println(socket.getInetAddress().getHostName() + ":" + socket.getLocalPort() + " - Email received as: " + email);

        in.ready();
        String password = in.readLine();
        System.out.println(socket.getInetAddress().getHostName() + ":" + socket.getLocalPort() + " - Password received as: " + password);

        boolean exists = false;

        for(int i = 0; i < gList.size(); i++) {
            if (email.equals(gList.get(i).getEmail())) {
                exists = true;
                if (password.equals(gList.get(i).getPassword())) {                      
                    out.write("SU");
                    out.flush();
                    out.newLine();
                    out.flush();
                    try(ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());){            
                        oos.writeObject(gList.get(i));
                        oos.flush();
                    }catch(IOException e) {
                        System.out.println(e.getMessage());
                    }
                }else{
                    out.write("WP");
                    out.flush();
                    out.newLine();
                    out.flush();
                }
            }
        }
        if(!exists) {
            out.write("IE");
            out.flush();
            out.newLine();
            out.flush();
        }
        socket.close();
    }catch(IOException e) {
        System.out.println(e.getMessage());
    }

}

Со стороны клиента он возвращает ClassNotFoundException в строке "g = (Guest) ois.readObject ();":

java.lang.ClassNotFoundException: server.Guest
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)

Тот факт, что в сообщении об ошибке указано «server.Guest», т. Е. (Пакет классов). (Объект), могу ли я предположить, что экземпляр класса Guest сервера не то же самое, что экземпляр экземпляра Guest учебный класс? Так как же правильно отправлять получаемые объекты через сокет?

Спасибо

1 Ответ

0 голосов
/ 17 января 2019

То, что в сообщении об ошибке написано "server.Guest", т.е. (класс пакет). (объект), могу ли я предположить, что экземпляр гостя сервера класс не то же самое, что экземпляр класса гостя клиента?

То, что участвуют два отдельных класса - это то, что говорит вам исключение, да.

Так как мне правильно отправлять получаемые объекты через сокет?

Ограничьте себя классами, которые известны клиенту и серверу. Существует множество способов сделать это, но все они в основном включают развертывание одинаковых или эквивалентных файлов .class на обеих сторонах соединения. «Эквивалент» здесь означает приблизительно «скомпилированный из того же источника с компиляторами той же версии».

...