0

2 台のマシン (Win 7 と Win XP VM) 間の RMI 通信に問題があります。I have problem の例外は次のとおりです。

java.rmi.ConnectException: Connection refused to host: 169.254.161.21; nested    exception is: 
java.net.ConnectException: Connection timed out: connect

接続中にアドレス192.168.1.4(サーバー)を使用するため、本当におかしくなりましたが、例外が何らかの形で異なることを示しています。両側でファイアウォールを無効にしました。ping は両側に動作します。サーバーへの telnet を試し、サーバー ポート telnet 192.168.1.4 1099 を使用しましたが、うまくいきました... どこに問題があるのか​​わかりません。これをホスト側(サーバー側など)で実行すると、すべて正常に動作します。

サーバーからはどのように見えますか:

public class Server  
{
  public static void main(String args[]) 
  {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);

String portNum, registryURL;
try{       

  System.out.println("Enter the RMIregistry port number:");
  portNum = (br.readLine()).trim();
  int RMIPortNum = Integer.parseInt(portNum);
  startRegistry(RMIPortNum); // Registry registry = LocateRegistry.createRegistry(RMIPortNum);
  ServerSide_Impl exportedObj = new ServerSide_Impl();
  registryURL = "rmi://localhost:" + portNum + "/callback";
  //registryURL = "rmi://192.168.1.4:" + portNum + "/callback";

  Naming.rebind(registryURL, exportedObj);
  System.out.println("Callback Server ready.");

}// end try
catch (Exception re) {
  System.out.println(
    "Exception in HelloServer.main: " + re);
 } // end catch
 } // end main

//This method starts a RMI registry on the local host, if
//it does not already exists at the specified port number.
private static void startRegistry(int RMIPortNum) throws RemoteException
{
try 
{
  Registry registry = LocateRegistry.getRegistry(RMIPortNum);
  registry.list( );  
    // This call will throw an exception
    // if the registry does not already exist
}
catch (RemoteException e) 
{ 
  Registry registry = LocateRegistry.createRegistry(RMIPortNum);
}
} // end startRegistry

} // end class

クライアント側は次のようになります。

try
    {
        this.serverAd = serverAddress.getText();
        String path = System.getProperty("user.dir");
        String pathAfter = path.replace("\\", "/");
        String pathFile = "file:/"+pathAfter + "/wideopen.policy";

        System.setProperty("java.security.policy", pathFile);           
        System.setSecurityManager(new RMISecurityManager());

        this.hostName = hostNameTextField.getText();
        this.portNum = hostPortNumberTextField.getText();          
        RMIPort = Integer.parseInt(this.portNum);
        this.time = Integer.parseInt(timeTextField.getText());
        //this.registryURL = "rmi://localhost:" + this.portNum + "/callback";  
        String registryURLString = "rmi://"+this.serverAd+":" + this.portNum + "/callback"; 
        this.registryURL = registryURLString;
        ConsoleTextField.append("\n"+ this.registryURL + "\n");

        // find the remote object and cast it to an 
        // interface object     

        obj = (ServerSide_Interface)Naming.lookup(this.registryURL);
        boolean test = obj.Connect();
        if(test)
        {
            callbackObj = new ClientSide_Impl();
            // register for callback
            obj.registerForCallback(callbackObj);

            isConnected = true;

            ConsoleTextField.append("Nawiązano połaczenie z serwerem\n");
            TableModel modelTemp = obj.Server_GenerateStartValues();
            myDataTable.setModel(modelTemp);

            myDataTable.setEnabled(true);
        }
        else ConsoleTextField.append("Brak połączenia z serwerem\n");


    }
    catch (Exception ex ){
        ConsoleTextField.append(ex + "\n"); 
        System.out.println(ex);
    }

ホスト側でクライアントを実行すると、この接続は正常に機能します。VM を使用して 2 台の異なるマシン間で接続しようとすると、何が悪いのかわかりません。

4

1 に答える 1

0

etc/hosts ファイルまたは DNS 設定に問題があります。サーバーの外部 IP アドレスとして間違った IP アドレスをサーバーに提供しているため、RMI は間違ったアドレスをスタブに埋め込み、クライアントは間違った IP アドレスに接続しようとします。

これを修正できない場合は、java.rmi.server.hostnameRMI オブジェクト (レジストリを含む) をエクスポートする前に、サーバー JVM でシステム プロパティを正しい IP アドレスに設定できます。これにより、RMI はそのアドレスをスタブに埋め込むように指示されます。

于 2013-02-03T03:28:17.023 に答える