RMI和2台机器 - 双向通信

时间:2013-02-03 00:11:46

标签: rmi

我遇到了两台机器之间的RMI通信问题(win 7和win xp VM)。我遇到问题的例外是:

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它正在工作......我无法弄清问题在哪里。 如果我在主机端(例如服务器端)运行它,一切正常。

从SERVER看起来如何:

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并尝试连接两台不同的机器,我可以;弄清楚我做了什么不好

1 个答案:

答案 0 :(得分:0)

您的etc / hosts文件或DNS设置有问题。它为服务器提供了错误的IP地址作为服务器的外部IP地址,因此RMI将错误的地址嵌入到存根中,因此客户端会尝试连接到错误的IP地址。

如果无法解决此问题,可以在导出任何RMI对象(包括注册表)之前,将系统属性java.rmi.server.hostname设置为服务器JVM上的正确IP地址。这告诉RMI将该地址嵌入存根中。