2012-08-30 24 views
1

我已經在本地ubuntu srver上成功建立了RMI系統。 註冊表端口1099和1100上的遠程對象導出(通過調用super(1100)修復) 現在我試圖通過公共IP在Internet上使它工作在Ubuntu上。 我可以使用公共ip正確地綁定服務。但客戶端小程序試圖在隨機端口連接到ubuntu服務器。 下面是由客戶端小程序拋出的錯誤:RMI小程序在隨機端口上發出請求並因此被阻止

// Exception 
network: Connecting public-ip:1100 with proxy=DIRECT 
network: Connecting public-ip/cgi-bin/java-rmi.cgi?forward=1099 with proxy=DIRECT 
network: Connecting public-ip:3733 with proxy=DIRECT 
network: Connecting public-ip:3721 with proxy=DIRECT 
// 
java.rmi.ConnectException: 
Connection refused to host: public-ip; nested exception is: java.net.ConnectException: Connection refused: connect at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
... 

我只有2個端口的服務器開放,即1099(註冊表)和1100(出口)。如何在applet請求中修復端口,以便它始終將服務器連接到同一個打開的端口上?

另一個問題。 因爲我已經綁定了公共IP上的服務,例如// public-ip:1099/ServiceName,所以在服務器上運行的作業將消息發送給Clinets無法向RMI服務發出請求。 public-ip URL不能在同一臺機器上工作,即server.Do你認爲我應該使用固定套接字工廠嗎?如果是這樣,請給我代碼片段,並指導我如何設置它。

//Exception 
java.rmi.ConnectException: Connection refused to host: public-ip; nested exception is: 
    java.net.ConnectException: Connection refused 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) 
    at $Proxy5.getUserID(Unknown Source) 
    at rmi.source.xxxxxx$JobScheduler.run(xxxxServerImpl.java:293) 
    at java.util.TimerThread.mainLoop(Timer.java:555) 
    at java.util.TimerThread.run(Timer.java:505) 
Caused by: java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:208) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
    ... 9 more 
+0

提示:如果它與Java有關或用Java編寫,請添加Java標記。 –

回答

0

我怎麼能解決港口小程序的請求,使得它始終連接服務器相同的開放端口上?

將遠程對象導出到固定的端口號上。

您是否認爲我應該使用固定套接字工廠?

不,您需要設置java.rmi.server.hostname系統屬性。

+0

謝謝你的快速響應。我通過調用super(1100)在服務器實現(擴展UnicastRemoteObject)構造函數上導出對象。我還在服務器上設置了公有IP的java.rmi.server.hostname屬性以及客戶端applet.Did在公共IP上重新綁定但現在得到以下異常: – Dan

+0

java.rmi.ServerException:在服務器線程中發生RemoteException;嵌套的異常是: \t java.rmi.ConnectException:連接拒絕主機:P.B.L.I.C-I.P;嵌套的例外是: \t java.net.ConnectException:連接在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:353) \t在sun.rmi.transport.Transport $ 1.run(Transport.java拒絕 \t :177) \t在sun.rmi.transport.Transport $ 1.run(Transport.java:174) \t在java.security.AccessController.doPrivileged(本機方法) – Dan

+0

@丹您是否收到來自內部或外部的LAN ?或兩者? RMI可能無效的推定是有一個每個人都可以使用的「最公開的」IP地址,因此是java.rmi.server.hostname設計。 – EJP