RMI lookup(Unknown Source)

Furtano

Mitglied
Ich versuche grade RMI zu lernen über ein ProxyPattern.
Ich verstehe den Fehler nicht :(.
Vielen Dank für eure Bemühungen im Voraus.


Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: client.ParkhausServiceImpl
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at client.Client.main(Client.java:24)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: client.ParkhausServiceImpl
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	... 2 more
Caused by: java.io.NotSerializableException: client.ParkhausServiceImpl
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at sun.rmi.transport.Transport$1.run(Transport.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
BUILD SUCCESSFUL (total time: 0 seconds)


Client.java
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.net.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Client {

    public static void main(String[] args) {

        try {
            Registry registry = LocateRegistry.getRegistry();
            ParkhausService service = (ParkhausService) registry.lookup("serviceDienst");
            service.in(5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Server.java
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.lang.reflect.InvocationTargetException;
import java.net.*;
import java.io.*;
import java.lang.reflect.Method;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server {

    static int plaetze = 5;
    static int check = 100;

    public static void main(String[] args) throws IOException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {

        Thread server = new Thread() {

            public void run() {
                try {
                    ParkhausService service = new ParkhausServiceImpl();
                    Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
                    registry.bind("serviceDienst", service);
                    Thread.sleep(10000);
                    registry.unbind("serviceDienst");

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        server.start();
        try {
            Thread.sleep(1);

        } catch (InterruptedException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

ParkhausService.java
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.net.*;
import java.io.*;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 *
 * @author Markus admin
 */
public interface ParkhausService extends Remote {

    public void in(int anzahl) throws RemoteException;

    public void out(int anzahl) throws RemoteException;

    public void free(int anzahl) throws RemoteException;
}

ParkhausServiceImpl.java
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 *
 * @author chris
 */
@SuppressWarnings("serial")                     
public class ParkhausServiceImpl implements ParkhausService {

    @Override
    public void in(int anzahl) throws RemoteException{



        if (Server.plaetze - anzahl < 0) {
            Server.check = 0;
            System.out.println("fail");


        } else {
            Server.check = 100;
            Server.plaetze = Server.plaetze - anzahl;
            System.out.println("Anzahl von Fahrzeugen, die reingefahren sind: " + anzahl);
            System.out.println("Die Anzahl von freien Plätzen beträgt: " + Server.plaetze);


        }

    }

    @Override
    public void out(int anzahl) throws RemoteException{



        if (Server.plaetze + anzahl > 5) {
            Server.check = 0;
            System.out.println("fail");


        } else {
            Server.check = 100;
            Server.plaetze = Server.plaetze + anzahl;
            System.out.println("Anzahl von Fahrzeugen, die rausngefahren sind: " + anzahl);
            System.out.println("Die Anzahl von freien Plätzen beträgt: " + Server.plaetze);


        }

    }

    @Override
    public void free(int anzahl) throws RemoteException{




        System.out.println("Die Anzahl von freien Plätzen beträgt: " + Server.plaetze);


    }
}

ParkhausServiceProxy.java
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.rmi.RemoteException;

/**
 *
 * @author chris
 */
public class ParkhausServiceProxy implements ParkhausService{

    private ParkhausServiceImpl _parkhausServiceImpl = new ParkhausServiceImpl();

    @Override
    public void in(int anzahl) throws  RemoteException {
        _parkhausServiceImpl.in(anzahl);
    }

    @Override
    public void out(int anzahl) throws  RemoteException{
        _parkhausServiceImpl.out(anzahl);
    }

    @Override
    public void free(int anzahl) throws  RemoteException {
        _parkhausServiceImpl.free(anzahl);
    }
    
    
    
    
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
NotSerializableException kann man nachschlagen, hat eine überschaubare Bedeutung:
die Klasse muss das Interface Serializable implementieren,

bin grad im Zweifel, ob das für RMI nötig ist, bei mir habe ich das glaube ich nicht so,
aber kann ja zumindest testweise nicht schaden, darüber nachdenken kann man immer noch,

mich wundert, dass ParkhausServiceImpl beim Client implementiert ist?
ist ein Proxy auch direkt nötig? scheint allerdings nirgend verwendet zu werden

richte dich vielleicht nochmal genau nach Tutorials, laufen fertige Internet-Beispiele?
 
S

SlaterB

Gast
für die Fehlermeldung habe ich es gesagt, ich möchte es nicht Buchstabe für Buchstabe wiederholen
ohne dass du in irgendeiner Form beschreibst ob du das gelesen/ verstanden hast, welches Detail offen sein könnte usw.

vom laufenden Tutorial aus würde ich Schritt für Schritt vorgehen, einzelne Klassen umbenenen,
einzelne Methoden so einfügen wie du sie brauchst (dann natürlich gleichzeitig im Interface + Implementierung),
wenn du einen kleinen Schritt findest, ab dem es nicht mehr geht, wäre etwas gewonnen
 

Furtano

Mitglied
Hi,
also es ist kein Tutorial daher kann ich nicht Schritt für Schritt nachmachen.
NotSerializableException sagt mir wirklich nichts, und was ich im Internet finde hilft mir auch nicht weiter.
Das RMI kann anscheinend irgendwie nicht die Methode aufrufen weil das Interface nicht seriazable ist ???

Das Proxy ist glaube ich wirklich nicht notwendig :)
 
S

SlaterB

Gast
Serialisierung ist ein Standardthema zum Nachlesen,
oder wenn nicht: du musst das Interface implementieren der Fehlermeldung nach, da gibts nichts weiter nachzudenken,
mit den allgemeinen Zweifeln wie gesagt, nicht als Normal-Lösung ansehen

> also es ist kein Tutorial daher kann ich nicht Schritt für Schritt nachmachen.
du sagst doch du hast fertige Beispiele, dann eben von denen aus umwandeln
 

Furtano

Mitglied
Hmm ich glaube nicht, dass es daran liegt, das hatten wir in der Uni noch gar nicht und das Programm sollte eigentlich ohne Probleme zu schreiben sein oO.
 
S

SlaterB

Gast
ein berechtigter Einwand, wie auch immer dazu schreibe,

ich persönlich kann leider aus dem Code nichts direkt erkennen, müsste mir alles mühsam kopieren
und zum Vergleich den 'normalen' RMI-Ablauf von irgendwo kopieren und halt vergleichen,
das ist eben wie ich sagte die Alternative eher für dich als für mich, solange nicht jemand anders in Kürze die Lösung sagt,

wenn du da schon weiter bist und irgendwo 'TestServiceImpl' oder so erfolgreich laufen hast,
dann gehe von dort aus, füge Methoden in/ out usw. ein,
so, jetzt habe ich das aber zum letzen Mal erwähnt, kein weiteres störendes Echo dazu ;)
 

Ähnliche Java Themen


Oben