है मैं एक छोटा आरएमआई आधारित चैट आवेदन लिख रहा हूँ।आरएमआई NotSerializableException हालांकि यह एक दूरस्थ वस्तु
विचार यह है कि: क्लाइंट सर्वर पर खुद को पंजीकृत करता है, और जब भी सर्वर क्लाइंट से संदेश प्राप्त करता है, तो वह इस संदेश को अन्य सभी ग्राहकों को धक्का देता है।
लेकिन मुझे एक NotSerializableException प्राप्त होता है हालांकि, ऑब्जेक्ट, मैं एक विधि पैरामीटर के रूप में गुजर रहा हूं दूरस्थ इंटरफ़ेस लागू करता है। (समस्याग्रस्त हिस्सा this.chatServ.registriereClient(this);
में this
पैरामीटर है (ClientChat कार्यान्वयन))
(ClientChat) इंटरफेस:
public interface ChatClient extends Remote
{
}
(ClientChat) कार्यान्वयन:
यहाँ कुछ कोड है
public class ChatClientImpl implements ChatClient
{
ChatServer chatServ;
String clientName;
public ChatClientImpl(String clientName, ChatServer chatServ) {
this.chatServ = chatServ;
this.clientName = clientName;
try {
this.chatServ.registriereClient(this);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
(सर्वरकैट) इंटरफेस
public interface ChatServer extends Remote
{
void registriereClient(ChatClient client) throws RemoteException;
}
(ServerChat) कार्यान्वयन
public class LobbyChatServerImpl implements ChatServer
{
ArrayList<ChatClient> clientListe = null;
@Override
public void registriereClient(ChatClient client) {
System.out.println("Client registriert");
this.clientListe.add(client);
}
}
ग्राहक:
public static void main(String[] args) {
ChatServer lobbyChatServer = null;
try {
Registry registry = LocateRegistry.getRegistry(Server.RMI_PORT);
lobbyChatServer = (ChatServer) registry.lookup("LobbyChatServer");
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
ChatClient lobbyChat = new ChatClientImpl(name, lobbyChatServer);
}
सर्वर:
public static void main(String[] args) {
try {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
Registry registry = LocateRegistry.getRegistry(RMI_PORT);
ChatServer lobbyChatStub = (ChatServer)UnicastRemoteObject.exportObject(new LobbyChatServerImpl(), 0);
registry.bind("LobbyChatServer", lobbyChatStub);
} catch (RemoteException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
अपवाद:
java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:156)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at $Proxy0.registriereClient(Unknown Source)
at de.XX.Chat.ChatClientImpl.<init>(ChatClientImpl.java:19)
at de.XX.Client.main(Client.java:49)
Caused by: java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:151)
... 5 more
जैसा कि पहले से ही कहा गया है, मुझे आश्चर्य है कि मुझे इस तरह की अपवाद क्यों मिलती है, हालांकि ChatClientImpl पहले ही रिमोट है।
आशा है कि आप मेरी मदद कर सकते :)
क्लाइंट और सर्वर कक्षाओं में अलग-अलग इसका उपयोग कैसे करें? – Usman
@ उस्मान कैसे उपयोग करें? – EJP