# RMI auf UNIX SERVER



## Flyer (7. Sep 2004)

hi...

habe ein JAVA file geschrieben, dass ich auf dem Unix Server laufen lassen möchte. doch es kommt folgender fehler:

```
TimerServiceRegister:java.rmi.server.ExportException: Port already in use: 1099;
 nested exception is:
        java.net.BindException: Address already in use
```

ich benutze den Befehl:

```
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
```

dieser benützt standartmässig den port 1099!
ich kenn mich leider zu wenig gut aus mit unix und weiss darum nicht an was es liegen könnte!
jemand ne idee?


----------



## foobar (7. Sep 2004)

Du hast anscheinend schon einen Dienst auf Port 1099 laufen. Hast du vielleicht noch irgendwelche Javaleichen am laufen? 
Dein Server sollte ungefähr so aussehen:

```
try 
		{
			LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
			Naming.rebind("Hello",new HelloImpl());
			System.out.println("running...");
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		catch (MalformedURLException e) 
		{
			e.printStackTrace();
		}
```


----------



## Bleiglanz (7. Sep 2004)

netstat -lpn


----------



## Flyer (7. Sep 2004)

jo sieht so aus...hab jetzt gerade nen tipp bekommen! ich mach jetzt eine policy datei, bei der mann den eigenen port angeben kann und es nicht den standarisierten nimmt


----------



## foobar (7. Sep 2004)

```
ps aux | grep "java"
```
Listet alle Javaprozesse auf.


----------



## thE_29 (7. Sep 2004)

ps ax | grep "java" reicht auch schoN


----------



## Flyer (7. Sep 2004)

die verbindung hab ich mit java nun hingekriegt! doch wie schaffe ich es einen befehl auszuführen von meinem pc aus? also z.B. "ll" und der unix server gibt mir die verzeichnisstrukur zurück?


----------



## foobar (7. Sep 2004)

Du mußt dir jetzt ein Remoteobjekt schreiben, daß dann einen Shellbefehl ausführt:

```
public String execCommand(String command)
	{
		StringBuffer out = new StringBuffer();
		try
		{
			Process p = Runtime.getRuntime().exec( command );
			BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String buffer = null;
			
			while ((buffer = in.readLine()) != null)
			{
				out.append(buffer);
			}
			in.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return out.toString();
	}
```


----------



## Flyer (7. Sep 2004)

dann kommt eine fehlermeldung wenn ich das einbaue:


```
TimerServiceClient:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.io.InvalidClassException: MyTimeStore; local class incompatible: stream classdesc serialVersionUID = 2753687262580067705, local class serialVersionUID = -7879807659299613068
```


----------



## Flyer (7. Sep 2004)

ups sorry...falsche fehler meldung gepostet:


```
java.io.IOException: CreateProcess: ll error=2
	at java.lang.Win32Process.create(Native Method)
	at java.lang.Win32Process.<init>(Unknown Source)
	at java.lang.Runtime.execInternal(Native Method)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)


	at java.lang.Runtime.exec(Unknown Source)
	at TimeServiceClient.execCommand(TimeServiceClient.java:43)
	at TimeServiceClient.<init>(TimeServiceClient.java:27)
	at TimeServiceClient.main(TimeServiceClient.java:11)
```


----------



## P3AC3MAK3R (7. Sep 2004)

Hier gibt es Beispielcode zum Thema:

http://javaalmanac.com/egs/java.rmi/pkg.html


----------



## foobar (7. Sep 2004)

Kompilier dein Klassen nochmal und starte dann den RMIServer erneut. Du hast verschiedene Versionen des Remoteobjekts auf Client und Serverseite.


----------



## Grizzly (7. Sep 2004)

Flyer hat gesagt.:
			
		

> ups sorry...falsche fehler meldung gepostet:
> 
> 
> ```
> ...


Der Fehler hat doch gar nichts mit RMI zu tun. Anscheinend versuchst Du den UNIX Befehl *ll* unter Windows auszuführen. Oder liege ich da falsch? ???:L


----------



## Flyer (7. Sep 2004)

plage mich nun seit geraumer zeit mit dieser fehlermeldung herum:


```
NamerServiceClient:java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
```

an was könnte es liegen?


----------



## Flyer (7. Sep 2004)

@Grizzly
sorry...hab es selbst gemerkt...hab die methode falsch eingefügt...aber die fehler meldung ob ist nun gekommen seit ich die methode am richtigen ort einfügt..


----------



## foobar (7. Sep 2004)

Ich habe mich auf diesen Fehler bezogen:


> TimerServiceClient:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
> java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
> java.io.InvalidClassException: MyTimeStore; local class incompatible: stream classdesc serialVersionUID = 2753687262580067705, local class serialVersionUID = -7879807659299613068


----------



## Gast (7. Sep 2004)

ach nö....mein programm will einfach nicht lauft...ich glaub ich schaff das nicht


----------



## foobar (7. Sep 2004)

> ach nö....mein programm will einfach nicht lauft...ich glaub ich schaff das nicht


Gib doch nicht gleich auf. Was ist denn jetzt das Problem?


----------



## Flyer (8. Sep 2004)

jetzt funzt nicht einmal die verbindung 

NamerServiceClient:java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
	java.io.EOFException


----------



## Gast (8. Sep 2004)

hm...jetzt kommt wieder ein neuer fehler 

TimeServiceClient:java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)


----------



## Flyer (8. Sep 2004)

lol...und wenn ich es über die dos-console starte kommt noch ein andere fehler:
java.security.AccessControlException: access denied (java.net.SocketPermission Servername resolve


----------



## foobar (8. Sep 2004)

> NamerServiceClient:java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
> java.io.EOFException


Hast du in deinem Remoteobjekt Serializable implementiert?


> TimeServiceClient:java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)


Hast du ein Policyfile angelegt?


----------



## Flyer (8. Sep 2004)

nun gehts 

das policy file hab ich schon angeleg!
ich musst nur noch eine FilePermission reinschreiben 

Danke an alle für die Unterstützung

Gruss Flyer


----------



## Flyer (8. Sep 2004)

noch ne kleine frage...die befehle "ls", "ll" etc.. laufen einwandfrei! möchte jetzt aber zum beispiel den befehl "cd .." haben...dieser geht jedoch nicht! warum

Gruss Flyer


----------



## Bleiglanz (8. Sep 2004)

cd ist kein Befehl, sondern ein eingebautes shell kommando und produziert keine ausgabe - hast du überhaupt eine shell?

geht denn 

ls ../ 

oder

cd .. ; ls


----------



## Grizzly (8. Sep 2004)

Flyer hat gesagt.:
			
		

> noch ne kleine frage...die befehle "ls", "ll" etc.. laufen einwandfrei! möchte jetzt aber zum beispiel den befehl "cd .." haben...dieser geht jedoch nicht! warum
> 
> Gruss Flyer


Weil Du mit Runtime.getRuntime().exec(...) immer nur ein Kommando an das System absetzen kannst. Nachdem der cd-Befehl ausgeführt wurde, arbeitet Java wieder weiter. Bei nächsten exec(...) startest Du wieder im Ausgangsverzeichnis.


----------



## Flyer (8. Sep 2004)

hmm...und wie könnte ich dieses problem lösen?


----------



## Flyer (8. Sep 2004)

ls .. geht!
aber eben...ich müsste das verzeichnis wechseln können!


----------



## Bleiglanz (8. Sep 2004)

In dem du die Shell selbst an exec übergibst (/bin/bash/) und dann nur die Befehle und deren Ausgaben hin und her schaufelst


----------



## Flyer (8. Sep 2004)

das bedeutet ich übergebe anstatt das commando einfach /bin/bash

und benütze dann InputReader und OuputWriter um die Kommandas auszuführen und dessen Resulat zu erhalten?
sehe ich das richtig?


----------



## Flyer (9. Sep 2004)

oder geht das anders?


----------



## Bleiglanz (9. Sep 2004)

nein, sollte so gehen


----------



## Flyer (9. Sep 2004)

bei mir geht es leider nicht! siehst du gerade was falsch ist?
die methode sollte für alle befehle funktionieren!


```
public String getAnswer() throws RemoteException 
{
    StringBuffer out = new StringBuffer(); 
    try 
    { 
        Process p = Runtime.getRuntime().exec("/bin/bash/");
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        bw.write("cd"); //in wirklichkeit String command
        bw.close();
			
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String buffer = null; 
          
        while ((buffer = in.readLine()) != null) 
        { 
            out.append(buffer+"\n");
        } 
        in.close();
    } 
    catch (IOException e) 
    { 
        e.printStackTrace(); 
    } 
	  
return out.toString();
}
```

Gruss Flyer


----------



## Bleiglanz (9. Sep 2004)

du brauchst eine interaktive shell

```
Process p = Runtime.getRuntime().exec("/bin/bash -i");
```
und nach cd gibts nix abzuholen und der reader funktioniert nicht (weil geblockt) usw.

überhaupt keinen Buffered writer verwenden, sonst musst du nach jedem befehl flushen


----------



## Flyer (9. Sep 2004)

aber wenn ich das -i hinzufüge und denn cd .. befehl ausführe und danach ls zeigt er mir immer noch das gleiche verzeichnis an...nicht das gewechselte


----------



## Flyer (9. Sep 2004)

wie soll ich dann sonst den "cd" befehl ausführen wenn nicht mit einem BufferedWriter?


----------



## Bleiglanz (9. Sep 2004)

```
bw.write("cd ..\n"); // damit die shell was mach ein Newline
bw.flush(); // damit das ding auch an die shell abgegeben wird
```


----------



## Flyer (9. Sep 2004)

hab es jetzt so gemacht! funzt aber trotzdem nicht...bleibt immer im gleichen ordner:

```
Process p = Runtime.getRuntime().exec("/bin/bash -i");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
bw.write(command+"\n");
bw.flush();
```


----------



## Flyer (9. Sep 2004)

hast du so etwas auch schonmal gemacht? Bleiglanz

nur weil ich denke es ist so gar nicht möglich!


----------



## Bleiglanz (9. Sep 2004)

> hast du so etwas auch schonmal gemacht? Bleiglanz



in dieser Form (mit einer interaktiven bash) nicht, ich glaube da tauchen zu viele Probleme auf - war deshalb vielleicht ein schlechter Tipp, sorry

cd selbst hat keinen output, in.read() wartet dann ewig; man müsste das in einem Thread machen

gepufferte I/O ist dabei vielleicht zu kompliziert; du musst den Befehl absetzen und dann das Ergebniss "live" abholen...

bei mir funktionier aber 

```
Process p = Runtime.getRuntime().exec("/bin/bash -i");
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
            String buffer = null;
            bw.write("cd ../../Java\n");
            bw.flush();
            bw.write("ll \n");
            bw.flush();
            System.out.println("foo");
            int i=0;
            while (-1!=(i=in.read()))
            {
                System.out.print((char)i);
                out.append((char)i);
            } 
            in.close();
            System.out.println("res="+out.toString());
```


----------



## Flyer (9. Sep 2004)

hi!

ich habe noch ne andere lösung gefunden!
geht einfach bisher nur "cd verzeichnis" und nicht "cd .."
ich verwendete:
Process p = Runtime.getRuntime().exec("ls", env, dir);
im dir wird der directory übergeben, wo es den Befehl "ls" ausführen soll!

Dies funktioniert!


----------



## Flyer (10. Sep 2004)

@Bleiglanz:

Danke für deine Hilfe


----------



## Bleiglanz (13. Sep 2004)

@Flyer

sorry dass ich dich auf einen Holzweg geführt habe (man sollte eben immer die API ordentlich studieren)!


----------

