2009-12-01 137 views
11

我在使用java rmi時出現問題:本地主機拒絕Rmi連接

當我嘗試運行我的服務器時,出現connectException(請參見下文)。執行重新綁定方法時

異常發生的情況:

Runtime.getRuntime().exec("rmiregistry 2020"); 
MyServer server = new MyServer(); 
Naming.rebind("//localhost:2020/RemoteDataPointHandler", server); 

使用RMI時://本地主機:2020/RemoteDataPointHandler相反,它也不起作用。同樣使用默認端口不起作用。我也嘗試使用127.0.0.1 ip地址,但效果相同。

我運行ARGS:

-Djava.security.policy=java.security.AllPermission 
 
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574) 
    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:306) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:160) 
    at be.fortega.knx.server.Main.(Main.java:25) 
    at be.fortega.knx.server.Main.main(Main.java:16) 
Caused by: java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:433) 
    at java.net.Socket.connect(Socket.java:524) 
    at java.net.Socket.connect(Socket.java:474) 
    at java.net.Socket.(Socket.java:371) 
    at java.net.Socket.(Socket.java:184) 
    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:569) 
    ... 7 more 

+1

我會說你在這裏有時間問題。重新綁定時,註冊表尚未完全啓動。 – EJP 2015-05-02 02:14:15

回答

5

看來,當我通過

LocateRegistry.createRegistry(2020); 

任何一個想法,爲什麼更換

Runtime.getRuntime().exec("rmiregistry 2020"); 

工作?有什麼不同?

+4

第二個將其作爲當前JVM中的遠程對象啓動。首先開始一個單獨的過程。 – EJP 2011-05-20 00:04:39

5

在嘗試連接(註冊)RMI服務之前,您需要先運行rmiregistry

LocateRegistry.createRegistry(2020)方法調用在指定的端口號上創建和導出註冊表。

LocateRegistry

+0

他的確看到了他的代碼。 – EJP 2011-07-10 05:02:13

11

的文件有與該連接異常的simliar問題。當註冊表尚未啓動時(如您的情況)或註冊表已被取消導出時(如我的情況),它會被拋出。

但是到了2種方式之間的差別很短的意見,啓動註冊表:

Runtime.getRuntime().exec("rmiregistry 2020"); 

運行在一個新的進程中的Java類斌目錄的rmiregistry.exe,並繼續與你的Java代碼的並行。

LocateRegistry.createRegistry(2020); 

rmi方法調用啓動註冊表,返回對該註冊表遠程對象的引用,然後繼續下一個語句。

在你的情況,當你試圖將對象綁定註冊表不及時啓動

+0

感謝您的解釋! – Fortega 2010-09-23 08:03:55

1

一個區別,我們可以在Windows注意的是:

如果使用Runtime.getRuntime().exec("rmiregistry 1024");

你可以看到rmiregistry的.EXE程序會在你的任務管理器中運行

而如果你使用Registry registry = LocateRegistry.createRegistry(1024);

你看不到進程在任務管理器中運行,

我認爲Java以不同的方式處理它。

,這是我的server.policy文件

運行的應用程序之前,請確保你殺了所有現有 的javaw.exe和rmiregistry.exe對應於這些 已經運行的RMI程序。

下面的代碼對我的作品被使用Registry.LocateRegistry()

Runtime.getRuntime.exec(""); 


// Standard extensions get all permissions by default 

grant { 
    permission java.security.AllPermission; 
}; 

VM參數

-Djava.rmi.server.codebase=file:\C:\Users\Durai\workspace\RMI2\src\ 

代碼:

package server;  

import java.rmi.Naming; 
import java.rmi.RMISecurityManager; 
import java.rmi.Remote; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

public class HelloServer 
{ 
    public static void main (String[] argv) 
    { 
    try { 

     if(System.getSecurityManager()==null){ 
      System.setProperty("java.security.policy","C:\\Users\\Durai\\workspace\\RMI\\src\\server\\server.policy"); 
      System.setSecurityManager(new RMISecurityManager()); 
     } 

Runtime.getRuntime().exec("rmiregistry 1024"); 

//  Registry registry = LocateRegistry.createRegistry(1024); 
    // registry.rebind ("Hello", new Hello ("Hello,From Roseindia.net pvt ltd!")); 
    //Process process = Runtime.getRuntime().exec("C:\\Users\\Durai\\workspace\\RMI\\src\\server\\rmi_registry_start.bat"); 

     Naming.rebind ("//localhost:1024/Hello",new Hello ("Hello,From Roseindia.net pvt ltd!")); 
     System.out.println ("Server is connected and ready for operation."); 
    } 
    catch (Exception e) { 
     System.out.println ("Server not connected: " + e); 
     e.printStackTrace(); 
    } 
    } 
} 
0

看來,你應該設置你的命令作爲String[]例如:

String[] command = new String[]{"rmiregistry","2020"}; 
Runtime.getRuntime().exec(command); 

它就像main(String[] args)的風格。

相關問題