Error unmarshalling arguments using JavaRMI

37 Views Asked by At

I've got this kind of error

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: ChatClient (no security manager: RMI class loader disabled)
    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:392)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
    at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1589)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:304)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:280)
    at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:166)
    at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:215)
    at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:160)
    at jdk.proxy1/jdk.proxy1.$Proxy0.joinChat(Unknown Source)
    at ChatClient.connectToServer(ChatClient.java:94)
    at ChatClient.<init>(ChatClient.java:87)
    at MainGUI.avviaChat(MainGUI.java:86)
    at MainGUI$1.actionPerformed(MainGUI.java:53)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6620)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398)
    at java.desktop/java.awt.Component.processEvent(Component.java:6385)
    at java.desktop/java.awt.Container.processEvent(Container.java:2266)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4995)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: ChatClient (no security manager: RMI class loader disabled)
    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:351)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
    at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.ClassNotFoundException: ChatClient (no security manager: RMI class loader disabled)
    at java.rmi/sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:401)
    at java.rmi/sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:188)
    at java.rmi/java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:639)
    at java.rmi/java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:265)
    at java.rmi/sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:199)
    at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2059)
    at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1925)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2248)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1760)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:538)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:496)
    at java.rmi/sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:329)
    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:340)
    ... 12 more

When I Invoke

server.joinChat(this);

in this class:

import javax.swing.*;

import interfaces.InterfaceChatClient;
import interfaces.InterfaceChatServer;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class ChatClient extends JFrame implements InterfaceChatClient {

    private static final long serialVersionUID = 1L;
    
    private final static String registryURL = "127.0.0.1";
    private String username;
    private String friend;
    private InterfaceChatServer server;
    
    private JTextArea chatArea;
    private JTextField inputField;

    public ChatClient() {
    }
    
    public ChatClient(String username, String friend) throws RemoteException, NotBoundException{
        super("Chat con " + friend);
        this.username = username;
        this.friend = friend;
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(700, 300);
        setResizable(false);
        setLocationRelativeTo(null);

        // Pannello principale con layout BorderLayout
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));

        // Area di chat (JTextArea) non modificabile
        chatArea = new JTextArea();
        chatArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatArea);
        mainPanel.add(scrollPane, BorderLayout.CENTER);

        // Pannello per l'input del messaggio e il pulsante Invia
        JPanel inputPanel = new JPanel(new BorderLayout());

        inputField = new JTextField();
        inputPanel.add(inputField, BorderLayout.CENTER);

        JButton emojiButton = new JButton("\uD83D\uDE01");
        emojiButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showEmojiSelector();
            }
        });
        inputPanel.add(emojiButton, BorderLayout.WEST);

        JButton sendButton = new JButton("Invia");
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    inviaMessaggio();
                } catch (RemoteException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        inputPanel.add(sendButton, BorderLayout.EAST);

        mainPanel.add(inputPanel, BorderLayout.SOUTH);

        // Aggiungi il pannello principale alla finestra con spaziatura dai bordi
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        add(mainPanel);

        // Rendi la finestra visibile
        setVisible(true);
        
        connectToServer();
    }

    private void connectToServer() throws RemoteException, NotBoundException {
        try {
            Registry r = LocateRegistry.getRegistry(registryURL, 7567);
            server = (InterfaceChatServer) r.lookup("server");
            server.joinChat(this);
        } catch (RemoteException | NotBoundException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(this, "Errore durante la connessione al server.");
        }
    }
    
    private void inviaMessaggio() throws RemoteException {
        String message = inputField.getText();
        if (!message.isEmpty()) {
            inputField.setText("");
            server.sendMessage(username, message);
            reciveMessage(username, message);
        }
    }

    private void showEmojiSelector() {
        JFrame emojiFrame = new JFrame("Selettore di Emoji");
        emojiFrame.setSize(300, 300);
        emojiFrame.setLocationRelativeTo(this);

        JPanel emojiPanel = new JPanel(new GridLayout(4, 4, 5, 5));

        String[] emojiCodes = {
                "\uD83D\uDE01", "\u2764", "\uD83D\uDE07", "\uD83D\uDE08",
                // Aggiungi altri codici di emoji secondo necessità
        };

        for (String emojiCode : emojiCodes) {
            JButton emojiButton = new JButton(emojiCode);
            emojiButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    insertEmoji(emojiCode);
                    emojiFrame.dispose();
                }
            });
            emojiPanel.add(emojiButton);
        }

        emojiFrame.add(emojiPanel);
        emojiFrame.setVisible(true);
    }
    
    private void insertEmoji(String emojiCode) {
        inputField.setText(inputField.getText() + emojiCode);
    }
    
    public String name() {
        return username;
    }
    
    public String friend() {
        return friend;
    }
    
    public void setEnabledInput(boolean status) {
        if(!status) { JOptionPane.showMessageDialog(this, "Stai aspettando " + friend); } else {
            JOptionPane.showMessageDialog(this, friend + " e' ora online!");
        }
        inputField.setEnabled(status);
    }
    
    public void reciveMessage(String from, String message) {
        System.out.println(from + " " + message);
        chatArea.append(from + ": " + message + "\n");
    }
}

that's my server code

import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import interfaces.*;

public class ChatServer extends UnicastRemoteObject implements InterfaceChatServer {
    private static final long serialVersionUID = 1L;
    
    private final HashMap<String, InterfaceChatClient> occupants = new HashMap<>();
    private final HashMap<String, String> friendship = new HashMap<>();

    public ChatServer() throws RemoteException {
    }
    
    public synchronized void joinChat(InterfaceChatClient client) throws RemoteException {
        String nickname = client.name();
        String friend = client.friend();
        System.out.println(nickname + " si è connesso");
        
        occupants.put(nickname, client);
        
        if(!friendship.containsKey(nickname)) {
            friendship.put(nickname, friend);
            friendship.put(friend, nickname);
            try {
                client.setEnabledInput(false);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(nickname + " e' in attesa.");
        } else {
            try {
                client.setEnabledInput(true);
                getFriend(nickname).setEnabledInput(true);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(nickname + " sta chattando " + friend);
        }
    }
    
    public void sendMessage(String from, String message) throws RemoteException {
        System.out.println(Thread.currentThread() + ":Il Server: ha ricevuto '" + message + "' da " + from);
        System.out.println(from);
        System.out.println(getFriend(from).name());
        getFriend(from).reciveMessage(from, message);
    }

    public static void main(String[] args) throws RemoteException {
        try {
            Registry r = LocateRegistry.createRegistry(7567);
            ChatServer obj = new ChatServer();
            r.rebind("server", obj);
            System.out.println("Server started");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public InterfaceChatClient getClient(String name) {
        return occupants.get(name);
    }
    
    public InterfaceChatClient getFriend(String name) {
        return occupants.get(friendship.get(name));
    }
}

I already read other post but everybody talk about the registry or class in classpath (that i already try, worked but every of the gui didn't response)

I want to know why my code is not working and what i can do to fix that. I've already done something in Java RMI but this error never happend to me. I use eclipse. Thanks!

0

There are 0 best solutions below