sto sviluppando un'applicazione Java che utilizza RMI.
Il punto è il senguente.
Ho creato il mio server rmi, ed il mio client.
Il server effettua correttamente la registrazione dell'interfaccia rmi
dei metodi remoti sul registry.
A questo punto se eseguo sia il server che il client all'interno di
Eclipse, tutto funziona correttamente, e lo stesso vale se eseguo il
server da Eclipse ed il client da riga di comando.
Basta però eseguire il server da riga di comando, che questo non
riceve più le chiamate remote del client, che si becca sempre una
Remote Exception.
Questo vale sia in locale che in rete LAN.
In particolare il server registra l'interfaccia sul registry sulla
porta 1099
try {
LocateRegistry.createRegistry(1099);
String host = InetAddress.getLocalHost().getHostAddress();
Naming.rebind("rmi://"+ host +":1099"+"/service",service);
System.out.println("REGISTRY INIZIALIZZATO");
} catch (RemoteException e) {
System.out.println("REGISTRY NON INIZIALIZZATO");
e.printStackTrace();
}
Il client fa la lookup al registry utilizzando l'inidirizzo IP del
server:
Service s =
(Service)Naming.lookup("rmi://"+ipaddress+":1099"+"/service");
s.doSomething();
Qualche suggerimento?
Grazie,
Jacopo
Jack ha scritto:
> Posta anke l'eccezione..
ecco qua il malloppo!
----------------------------------------------------------
java.rmi.UnmarshalException: error unmarshalling return; nested
exception is:
java.io.EOFException
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:157)
at
java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179)
at
java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy0.receiveJoin(Unknown Source)
at rmi.RMIClientSide.sendJoin(RMIClientSide.java:103)
at controller.Controller.actionPerformed(Controller.java:468)
at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
at
javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1000)
at
javax.swing.plaf.basic.BasicMenuItemUI$Handler.menuDragMouseReleased(BasicMenuItemUI.java:1104)
at javax.swing.JMenuItem.fireMenuDragMouseReleased(JMenuItem.java:578)
at javax.swing.JMenuItem.processMenuDragMouseEvent(JMenuItem.java:475)
at javax.swing.JMenuItem.processMouseEvent(JMenuItem.java:422)
at
javax.swing.MenuSelectionManager.processMouseEvent(MenuSelectionManager.java:283)
at
javax.swing.plaf.basic.BasicPopupMenuUI$MouseGrabber.eventDispatched(BasicPopupMenuUI.java:757)
at
java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Toolkit.java:2206)
at
java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Toolkit.java:2100)
at
java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Toolkit.java:2099)
at
java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Toolkit.java:2099)
at java.awt.Toolkit.notifyAWTEventListeners(Toolkit.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:3867)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:358)
at
java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2724)
at java.io.ObjectInputStream.readInt(ObjectInputStream.java:919)
at javax.swing.ImageIcon.readObject(ImageIcon.java:391)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.util.ArrayList.readObject(ArrayList.java:587)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:290)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:139)
... 37 more
--------------------------------------------
Jack ha scritto:
> Dai una controllata al classpath del client se ci sono gli stub e skel
> del server.
Dunque ora ci guardo meglio ma credo che il problema sia un altro.
Infatti mi sono scordato di specificare che l'applicazione è P2P
quindi il server e il client in realtà sono due istanze identiche che
utilizzano la stessa interfaccia remota. Quindi in pratica io avvio N
istanze e poi ognuna farà da server e/o client durante l'esecuzione...
Quindi a questo punto il dubbio è perchè quando l'applicazione si
comporta da server funzioni solo se avviata da Eclipse e invece non
vada quando è avviata da console!!
grazie
Jack ha scritto:
In pratica durante una chiamata remota al server il client dovrebbe
ricevere un oggetto Card che fra i campi ha una ImageIcon. Questa in
pratica viene caricata nel server:
ImageIcon image = new ImageIcon(path);
e poi inviata in risposta alla chiamata remota del client.
Se commento la creazione dell'ImageIcon tutto funziona... ovviamente
sul client poi non vedo l'immagine!
Quello che non capisco è dove sia il problema visto che i path sono
tutti relativi ed essendo applicazioni P2P in realtà le immagini
risiedono nelle stesse directory sia sul client che sul server
Jack ha scritto: