Avatar billede mora Nybegynder
10. juli 2003 - 13:14 Der er 28 kommentarer og
1 løsning

RMI+Nat port problem

Jeg skal havde en RMI server til at køre på et nat netværk (med fast ekstern ip).
men når jeg connecter siger den enten at 192.168.0.1 ikke findes (lokal ip) eller at den ikke kan forbinde til den eksterne ip. (
når jeg starter med -Djava.rmi.server.hostname=ekstern_ip program
)

Jeg har prøvet at implementere denne url
http://www.javacoding.net/articles/technical/rmi-firewall.html

men så kommer følgende fejl når jeg vil compile kontoserver.

Kontoserver.java:10: cannot access FixedPortRMISocketFactory
bad class file: ./FixedPortRMISocketFactory.class
class file contains wrong class: server.FixedPortRMISocketFactory
Please remove or make sure it appears in the correct subdirectory of the classpath.
RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
                                      ^
1 error



KONTOSERVER ***
import java.rmi.Naming;
public class Kontoserver
{

  public static void main(String[] arg) throws Exception
  {
    KontoI k = new KontoImpl();

try {
RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
} catch (IOException e) {
e.printStackTrace();
}

    Naming.rebind("rmi://localhost/kontotjeneste", k);
    System.out.println("Kontotjeneste registreret.");
  }
}
Avatar billede arne_v Ekspert
10. juli 2003 - 13:28 #1
Kontoserver.java:10: cannot access FixedPortRMISocketFactory
bad class file: ./FixedPortRMISocketFactory.class
class file contains wrong class: server.FixedPortRMISocketFactory
Please remove or make sure it appears in the correct subdirectory of the classpath.
RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
                                      ^
1 error

er heldigvis ikke et RMI problem !

Grundet directory struktur eller jar fil indholde forventer den
bare en klasse FixedPortRMISocketFactory som ikke er i pakke. Men
den er faktisk i en pakke "server".

Flere muligheder:

1)  slet

package server;

2)  omorganiser directory/jar-fil så FixedPortRMISocketFactory
    ligger i et server directory under det directory hvor Kontoserver ligger.
Avatar billede mora Nybegynder
10. juli 2003 - 13:40 #2
Hmm, ja det fiksede compile fejlen :)

Men kan stadig ikke forbinde.
Har forvardet 1099 og 1098 til den lokale ip (i firewallen)

KLIENTEN
D:\rmi>java Kontoklient
java.rmi.ConnectException: Connection refused to host: 80.62.89.xxx; nested exception is:
        java.net.ConnectException: Connection refused: connect


SERVER
apache:/rmi # java -Djava.rmi.server.hostname=80.62.89.xxx Kontoserver
Kontotjeneste registreret.
Avatar billede mora Nybegynder
10. juli 2003 - 13:41 #3
jeg får nu heller ikke de debug our.print fra den nye socketfactory, bruger jeg mon den forkert?
Avatar billede arne_v Ekspert
10. juli 2003 - 14:01 #4
Så er vi ti,bage ved RMI og så er det straks vanskeligere.

:-(

Din socket factory laver en socket som lytter på port 1098.

RMI registry (som du har startet separat) lytter på default port
1099.

Du har åbnet for indgående TCP port 1098 og 1099.

?
Avatar billede arne_v Ekspert
10. juli 2003 - 14:03 #5
Logikken er:

1) client connecter til RMIregstry
2) client connecter til server

Hvis #1 fejler og du ikke bruger din socket factory til RMIregistry, så
bliver din socket factory naturligvis ikke kaldt.
Avatar billede arne_v Ekspert
10. juli 2003 - 14:04 #6
Hvis du skal bruge din socket factory for RMIregistry så skal du
starte den med din server og ikke bruge standalone RMIregistry.
Avatar billede arne_v Ekspert
10. juli 2003 - 14:05 #7
[iøvrigt er det ofte nemmere at bruge en web-service ind gennem
en firewall / router-med-NAT]
Avatar billede mora Nybegynder
10. juli 2003 - 14:14 #8
Jeg bruger dette til at lave rmi, korrekt ?

Registry r = LocateRegistry.getRegistry(1099);
r.rebind("MyServer", k);

Kontoserver.java:11: cannot resolve symbol
symbol  : variable RMISocketFactory
location: class Kontoserver
RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
^
Kontoserver.java:12: cannot resolve symbol
symbol  : class IOException
location: class Kontoserver
} catch (IOException e) {
        ^
Kontoserver.java:16: cannot resolve symbol
symbol  : class Registry
location: class Kontoserver
Registry r = LocateRegistry.getRegistry(1099);
^
Kontoserver.java:16: cannot resolve symbol
symbol  : variable LocateRegistry
location: class Kontoserver
Registry r = LocateRegistry.getRegistry(1099);
            ^
4 errors
Avatar billede mora Nybegynder
10. juli 2003 - 14:15 #9
kilden

import java.rmi.*;

public class Kontoserver
{

  public static void main(String[] arg) throws Exception
  {
    KontoI k = new KontoImpl();

try {
RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
} catch (IOException e) {
e.printStackTrace();
}

Registry r = LocateRegistry.getRegistry(1099);
r.rebind("kontotjeneste", k);

//    Naming.rebind("rmi://localhost/kontotjeneste", k);
    System.out.println("Kontotjeneste registreret.");
  }
}
Avatar billede arne_v Ekspert
10. juli 2003 - 14:20 #10
Du mangler vist lidt import sætninger.
Avatar billede arne_v Ekspert
10. juli 2003 - 14:21 #11
import java.io.*;
import java.rmi.registry.*;
Avatar billede mora Nybegynder
10. juli 2003 - 14:22 #12
nevermind :) importerede nogle klasser så virkede det bedre
Avatar billede mora Nybegynder
10. juli 2003 - 14:22 #13
rmiregistry (standalone) skal ikke køre, korrekt ?
Avatar billede mora Nybegynder
10. juli 2003 - 14:23 #14
apache:/rmi # java -Djava.rmi.server.hostname=80.62.89.106 Kontoserver
creating        socket to host : 192.168.0.39 on port 1099
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.0.39; nested exception is:
        java.net.ConnectException: Connection refused
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:313)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at Kontoserver.main(Kontoserver.java:20)
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
        at java.net.Socket.connect(Socket.java:426)
        at java.net.Socket.connect(Socket.java:376)
        at java.net.Socket.<init>(Socket.java:291)
        at java.net.Socket.<init>(Socket.java:119)
        at FixedPortRMISocketFactory.createSocket(FixedPortRMISocketFactory.java:18)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562)
        ... 5 more
Avatar billede mora Nybegynder
10. juli 2003 - 14:24 #15
Kontoserver burde vel ikke connecte til noget ? bare lytte
Avatar billede arne_v Ekspert
10. juli 2003 - 14:28 #16
Ja - standalone RMIregistry skal ikke køre.

Lidt mystisk.
Avatar billede mora Nybegynder
10. juli 2003 - 15:36 #17
prøvede at ændre porten til 2501 men det ændrede ikke noget med fejlen :/
Avatar billede mora Nybegynder
10. juli 2003 - 15:43 #18
at Kontoserver.main(Kontoserver.java:20)
at FixedPortRMISocketFactory.createSocket(FixedPortRMISocketFactory.java:18)

Det må være fejlen, da createSocket er når man laver connections ud, og createServerSocket er til at listen
Avatar billede arne_v Ekspert
10. juli 2003 - 17:15 #19
Prøv med:

Registry r = LocateRegistry.createRegistry(1099);

i.s.f.:

Registry r = LocateRegistry.getRegistry(1099);
Avatar billede mora Nybegynder
10. juli 2003 - 20:03 #20
Med creareRegistry kan serveren godt starte og blive ved med at køre, men kontoklient kan ikke bruge den alligevel ? har prøvet telnet og den ser ud til at svare.

port 1099+1098 er natted.


Hmm, skal rmi først melde fejl når man bruger det ?

(Snip fra kontoklient)
KontoI k =(KontoI) Naming.lookup("rmi://80.62.89.xxx/kontotjeneste");
System.out.println("Objekt hentet");
k.overførsel(100);
System.out.println("Overførsel1 ok");

(Ved kørsel)
D:\rmi>java Kontoklient
Objekt hentet
java.rmi.ConnectException: Connection refused to host: 80.62.89.xxx; nested exception is:
java.net.ConnectException: Connection refused: connect
Avatar billede arne_v Ekspert
10. juli 2003 - 20:05 #21
Har du checket at at det faktisk er port 1098 og 1099 der lyttes
på (at din socket factory virker) ?

Kan checkes med:
  netstat -a
Avatar billede mora Nybegynder
10. juli 2003 - 20:10 #22
tcp        0      0 :::1099                :::*                  LISTEN

1098 er der ikke, men den laves vel også først når en klient har forbundet?
Avatar billede mora Nybegynder
10. juli 2003 - 20:14 #23
den listen linje er i øvrigt magen til min ident service i java der virker :) (blot med en anden port)
Avatar billede arne_v Ekspert
10. juli 2003 - 21:08 #24
Nej server porten burde også LISTEN bare når server programmet kører.
Avatar billede mora Nybegynder
10. juli 2003 - 21:29 #25
Det er ikke hvad den URL jeg postede først siger?

As you may already know, your RMI Server opens up a serversocket on port 1099 and then listens here for incoming requests. If a request comes in, ANOTHER port is used to handle the request and send back the response
Avatar billede arne_v Ekspert
10. juli 2003 - 21:37 #26
Det er rigtigt at en anden port bruges til processe client request, *men*
den åbnes altså ved startup ikke ved client connect.
Avatar billede mora Nybegynder
10. juli 2003 - 21:46 #27
weeeeeeee
its alive

recompilede det hele, nu skriver den at den lytter på 2 porte ved start, og min client virker fra en anden host.

Takker :)
Avatar billede mora Nybegynder
10. juli 2003 - 21:46 #28
En port (1098) er nok til flere samtidige klient forbindelser, ikke ?
Avatar billede arne_v Ekspert
10. juli 2003 - 21:48 #29
Jo.

En RMI server applikation har kun en ServerSocket (din lytter så på 1098), for
hver connection den accepter laver den en Socket.

Du skal bruge flere porte, hvis du kører flere RMIServer applikationer,
men det er en helt anden sag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester