2011-04-07 182 views
0

经过艰苦的努力,我已经建立了使用Apache的Java RMI隧道作为http服务器的http 。一切都很好,在我的办公室LAN工作起来就像一个魅力。但是当我安装在客户端时,我收到了一些异常.RMI系统只能在他的服务器上工作。java.rmi.ConnectException:连接拒绝主机

当我尝试从其他客户的PC,我得到以下。

你们能帮我解决吗?

java.rmi.ConnectException: Connection refused to host: 172.xx.x.xxx; 
nested exception is: java.net.ConnectException: Connection timed 
out: 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.invoke(Unknown Source)  at 
java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown 
Source) at 
java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) 
    at $Proxy1.getUserID(Unknown Source) at 
rmi.source.ServerImpl$JobScheduler.run(ServerImpl.java:265) at 
java.util.TimerThread.mainLoop(Unknown Source)  at 
java.util.TimerThread.run(Unknown Source) Caused by: 
java.net.ConnectException: Connection timed out: connect at 
java.net.PlainSocketImpl.socketConnect(Native Method) at 
java.net.PlainSocketImpl.doConnect(Unknown Source)  at 
java.net.PlainSocketImpl.connectToAddress(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) ... 10 more 

回答

1

RMI服务器有坏习惯通过新的端口号给客户办理向特定对象远程客户端通信。如果此端口号被防火墙阻止,您将得到类似的异常。 确保您注册了具有相同端口号的所有Remote对象。然后,RMI将为您的客户呼叫进行多路复用。

+0

我用LocateRegistry.getRegistry(rmiHost,rmiPort,新sun.rmi.transport.proxy.RMIHttpToCGISocketFactory())通过将相同的端口 我在服务器中创建一个远程对象获取注册表使用由所有小程序客户端。 此外,我还在jre和catalina.policy文件中为java.policy文件提供了完全权限。有趣的是,中间没有防火墙m/c将请求路由到服务器。 但在每个m/c上启用了windows防火墙。这与我的办公室中RMI系统正常工作的情况相同。 – SachinIndia 2011-04-07 11:19:58

+0

你如何创建服务器端的远程对象?它们是否继承UnicastRemoteObject,如果是,那么你使用的是哪个super.ctor? – 2011-04-07 17:52:11

+0

谢谢你的回复我在leave.My服务器类继承UnicastRemoteObject。我使用的构造函数只是super() – SachinIndia 2011-04-12 06:59:02

2

我从roseindia RMI 运行的文件有错误rmicregistry,一个必须使用rmiregistry

我改变IP为localhost,如何在特殊的端口号运行,我不知道这一刻 一个具有使用rmiregistry 非rregregistry

所以: 移动到您的班级文件的位置的文件夹。 类型:rmiregistry 然后打开2个新的命令提示符移动到相同的文件夹,其中类位于和使用一个运行服务器和另一个客户端。

0

经过我的研究,解决方案是: System.setProperty("java.rmi.server.hostname", IP);在服务器端注册服务之前,请使用 。以下是一个例子,希望它可以帮助你!

public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { 
     RmiServer server=new RmiServer(); 
     System.setProperty("java.rmi.server.hostname", 指定IP); 
     LocateRegistry.createRegistry(8808); 
     Naming.rebind("//10.10.116.74:8808/SAMPLE-SERVER", server); 
    }