2011-05-30 72 views
2

我試圖運行一個簡單的rmi應用程序。然而,我遇到了無法解釋的(對我來說)錯誤。連接到錯誤地址的RMI註冊表

我有我的對象CheckerImplementation實現遠程接口檢查器。我試圖用這個代碼設置了[實例()返回CheckerImplementation類型的對象]:

  try 
      { 
       Checker stub = (Checker) UnicastRemoteObject.exportObject(Instance(), 0); 

       // Bind the remote object's stub in the registry 
       Registry registry = LocateRegistry.getRegistry(); 
       registry.bind("Checker", stub); 

       System.err.println("Server ready"); 
      } 
      catch (Exception e) 
      { 
       System.err.println("Server exception: " + e.toString()); 
       e.printStackTrace(); 
      } 

在運行的時候,我得到下面的異常:

java.rmi.ConnectException: Connection refused to host: 10.105.124.34; nested exception is: 
java.net.ConnectException: Connection refused: connect 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601) 
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) 
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) 
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 
at Checker.CheckerImplementation.main(CheckerImplementation.java:172) 
Caused by: java.net.ConnectException: Connection refused: connect 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
at java.net.Socket.connect(Socket.java:529) 
at java.net.Socket.connect(Socket.java:478) 
at java.net.Socket.<init>(Socket.java:375) 
at java.net.Socket.<init>(Socket.java:189) 
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
... 5 more 

爲什麼Java的努力無論如何連接到10.105.124.34?這不是本地主機。這可能是什麼問題,如何解決這個問題?

經過一番實驗,我發現10.105.124.34確實是我的IP地址。但問題依然存在:爲什麼不是127.0.0.1?

+0

它是你的機器在本地網絡中的IP? – 2011-05-30 20:19:25

回答

3

Are you sure 10.105.124.34 is not your local IP?運行ifconfig/ipconfig。這是負責選擇這個地址(java.rmi.registry.LocateRegistry#getRegistry)代碼:

if (port <= 0) 
    port = Registry.REGISTRY_PORT; 

if (host == null || host.length() == 0) { 
    // If host is blank (as returned by "file:" URL in 1.0.2 used in 
    // java.rmi.Naming), try to convert to real local host name so 
    // that the RegistryImpl's checkAccess will not fail. 
    try { 
     host = java.net.InetAddress.getLocalHost().getHostAddress(); 
    } catch (Exception e) { 
     // If that failed, at least try "" (localhost) anyway... 
     host = ""; 
    } 

要包起來:你需要RMI註冊表(服務器)在您的計算機上本地運行。顯然你試圖連接到它(端口1099),但沒有任何運行。

1

那麼,你可以肯定地說它拋出了這個異常,因爲它試圖連接到10.105.124.34出於某種原因,它不工作。

這裏有一個建議:你正在運行它的機器上的IP地址是什麼? 10.105.124.34位於舊BBN A類網絡中,現在每個人都使用它作爲匿名NAT內部網絡,所以我打賭你的路由器通過DHCP分配你的機器。 (提示:ifconfig在UNIX上,ipconfig在Windows上)

如果是這樣,你居然運行 RMI服務?綁定時會怎樣迴應電話?

+0

我正在運行RMI服務。我從http://download.oracle.com/javase/tutorial/rmi/index.html – Srv19 2011-05-30 20:26:37

+0

那裏從RMI示例的服務器部分獲取了代碼那麼,由於您剛剛標記爲正確的(後來同構的)答案,我推測事實上,你有教程代碼是不夠的。 – 2011-05-30 21:03:31

+0

你的答案都是正確的,因爲最終我的問題來自於不創建註冊表。不過,我只能選擇一個正確的答案,所以這裏是。至於教程 - 如果一個人沒有充分利用他的眼睛和大腦,並且像我一樣,在這裏困擾好人,那就沒什麼用處。 – Srv19 2011-06-03 09:54:35

-1

開始 - > cmd - > rmiregistry,關閉2 cmd窗口。 再次運行您的服務器代碼。