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!