Newsgroup: it.comp.java
Titolo: RMI: strano comportamento fuori da Eclipse

Salve a tutti,
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

Posta anke l'eccezione..
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
--------------------------------------------

Dai una controllata al classpath del client se ci sono gli stub e skel
del server.
Jack ha scritto:


 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

Sarebbe molto utile  capire con quali parametri eclipse lancia il
processo java x la tua applicazione. Non ce' modo di visualizzare cio'?
Anke attraverso qualche tool esterno tipo ProcessExplorer x window o il
comando ps -ef x linux
Jack ha scritto:


Dunque facendo alcune prove ho notato che il problema è dato dalla
serializzazione delle immagini.
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

Mi spiace ma non so aiutarti.
 Alla peggio pero puoi far passare l'immangine tramite un byte[] invece
che utilizzare la classe ImageIcon
Jack ha scritto:
