2015-10-01 2 views
0

J'ai deux ordinateurs. Sur l'un d'entre eux, est en cours d'exécution d'un registre RMI - qui a été créé à partir de ce code seul:Essayer de se connecter au Registre RMI mais obtenir java.net.ConnectException: Connexion refusée: se connecter

package main; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.util.Scanner; 

public class TheRegistry{ 

    public static void main(String[] args) { 
     try { 
      Registry reg = LocateRegistry.createRegistry(2020); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally{ 
      System.out.println("Registry Created"); 
      Scanner input = new Scanner(System.in); 
      input.nextInt(); 
      System.exit(0); 
     } 
    } 
} 

L'autre ordinateur est équipé d'un serveur qui tente d'enregistrer un objet sur ce registre, cependant, il fait une exception. Voici le code pour le serveur:

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 
import java.rmi.*; 

public class TextScramblerServer implements TextScramblerInterface 
{ 
    private static Remote obj; 
    // main method to export 
    @Override //Return input text as-is. 
    public String testInputText(String inputText) { 

     return "Your input text is: " + inputText; 
    } 

    @Override //Return the string reversed. 
    public String reverse(String inputText) { 
     String reversedInput = ""; 
     for(int i=0; i<inputText.length();i++) 
     { 
      reversedInput=reversedInput+inputText.charAt((inputText.length()-1)-i); 
     } 
     return "Result: "+reversedInput; 
    } 

    @Override //Return the string scrambled. 
    public String scramble(String inputText) { 
     String scrambledInput=""; 

     for(int i=0; i<inputText.length();i++) 
     { 
      if(i%2==0) 
      { 
       scrambledInput=scrambledInput+inputText.charAt(i); 
      } 
      else 
      { 
       scrambledInput=inputText.charAt(i)+scrambledInput; 
      } 
     } 
     return "Result: "+scrambledInput; 
    } 

    public void exportServer() throws Exception { 
     System.setSecurityManager(new RMISecurityManager()); 
     obj = UnicastRemoteObject.exportObject(this, 2022); 
     Registry registry = LocateRegistry.getRegistry("132.205.94.50", 2020); 
     registry.bind("test", obj); 
    } 

    public static void main(String[] args) { 
     try { 
      (new TextScramblerServer()).exportServer(); 
      System.out.println("Server is up and running"); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      try { 
       UnicastRemoteObject.unexportObject(obj, true); //close port 
      } catch (NoSuchObjectException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

Je continue à obtenir l'erreur:

java.rmi.ConnectException: Connection refused to host: 132.205.94.50; nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source) 
    at sun.rmi.server.UnicastRef.newCall(Unknown Source) 
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 
    at TextScramblerServer.exportServer(TextScramblerServer.java:57) 
    at TextScramblerServer.main(TextScramblerServer.java:62) 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source) 
    ... 7 more 
java.rmi.NoSuchObjectException: object not exported 
    at sun.rmi.transport.ObjectTable.unexportObject(Unknown Source) 
    at java.rmi.server.UnicastRemoteObject.unexportObject(Unknown Source) 
    at TextScramblerServer.main(TextScramblerServer.java:68) 

Je ne peux pas comprendre pourquoi ce qui se passe. Je pense avoir tout essayé

+0

netstat indique-t-il que le port 2020 est en cours d'utilisation? Si oui, peut-être que le registre reg est collecté? – rogerdpack

+0

@rogerdpack oui c'est (cette machine est sur Ubuntu, donc j'ai utilisé 'lsof -i 2020') – CodyBugstein

+0

avez-vous mis les permissions exactes dans le fichier de stratégie java du serveur: ' // permet à quiconque d'écouter sur les ports dynamiques permission java.net.SocketPermission "localhost: 0", "écouter, connecter, lire, écrire"; ' –

Répondre

1

J'ai couru votre code et cela a fonctionné pour moi after configuring the security policy.

Votre exception ConnectionRefused signifie que la connexion TCP sous-jacente ne peut être établie. C'est un problème de réseau, pas un problème de RMI. Essayez d'exécuter le serveur et le registre sur le même hôte et utilisez le localhost comme nom d'hôte. Si cela fonctionne, le problème est probablement un problème de pare-feu entre les deux hôtes.

Vous pouvez faire un simple test of a TCP connection to the specific port using telnet. Si le port n'écoute pas, telnet vous donnera un message de refus de connexion similaire. Si le port écoute, vous obtiendrez quelque chose comme ceci sur le terminal:

Connected to localhost. 
Escape character is '^]'. 

Contrôle-C pour sortir de la session.

La sortie de telnet spécifique peut varier en fonction de votre système d'exploitation, mais ils sont tous à peu près les mêmes.

S'il s'agit d'un problème de pare-feu, vous devrez ouvrir les ports. Comment faire cela dépend du système d'exploitation, mais il est facile à trouver.

-1

Soit votre registre a été collecté de manière ordure, l'adresse IP est incorrecte, ou il s'agit d'une adresse IP publique et vous n'avez pas configuré de redirection de port.

Vous devez stocker la référence du Registre dans un objet statique pour surmonter la récupération de place, même si le point de ce programme est quand rmiregistry.exe existe déjà m'échappe complètement.

Vous abîmez le mauvais arbre de toute façon. Vous pouvez uniquement lier à un Registre RMI qui s'exécute dans l'hôte local. Par conséquent, il n'est jamais nécessaire d'utiliser un nom d'hôte de Registre autre que "localhost" lors de la liaison ou de la dissociation.

La raison pour laquelle vous avez obtenu le NoSuchObjectException est que vous essayez de UNEXPORT le talon, qui est désigné par obj, qui est le résultat de UnicastRemoteObject.exportObject(), qui retourne le talon. Voir le Javadoc. Vous devez enregistrer le résultat de new TextScramblerServer() et ne pas l'exporter.

+0

'Vous pouvez uniquement lier à un registre RMI qui s'exécute dans l'hôte local. "Alors, quel est le point de RMI? Si tout doit être local, il n'y aura pas de système distribué. – CodyBugstein

+0

@Imray Tout ne doit pas être local. Vous pouvez * rechercher * un registre distant. Vous ne pouvez pas * lier * à un registre distant. C'est une mesure de sécurité. – EJP

+0

@downvoter Ne me fais pas de mal. – EJP